2009-04-22 10 views
3

J'utilise Linq to Entities. J'ai ma table principale, configuration de l'employé avec un champ nommé vendorID. L'ID du fournisseur est une clé étrangère dans la table Vendors.Linq to Entities (EF): Comment obtenir la valeur d'un FK sans faire la jointure

Comme c'est le cas actuellement, l'objet Employee n'expose pas directement l'identificateur de fournisseur. Au lieu de cela, je ne peux accéder à cette façon:

var employee = (from e in context.Employees.Include("tbl_vendors") 
       where e.employeeID = 1 
       select e).FirstOrDefault(); 

//this gets the vendor ID 
int vendorID = employee.tbl_vendors.vendorID; 

C'est très bien et dandy, mais il est un travail supplémentaire sur la base de données, car il oblige une jointure où aucun besoin. Est-il possible d'obtenir cette valeur de clé sans être obligé de faire une jointure à la table tbl_vendors?

Répondre

3

Vous pouvez accéder à la clé étrangère via la référence de l'entité.

Employee employee = context.Employees.Single(e => e.employeeID == 1); 

Int32 vendorID = (Int32)employee.tbl_vendorsReference.EntityKey. 
    EntityKeyValues[0].Value; 

Voir MSDN de référence sur les classes EntityReference et EntityKey.

+0

Il n'y a donc aucun moyen de le référencer par son nom plutôt que par l'emplacement de l'index de la clé? Il semble dangereux d'utiliser l'index car il pourrait potentiellement être changé si une nouvelle clé est ajoutée à la table. – bugfixr

+1

Ce n'est pas l'emplacement d'index de la clé, c'est l'emplacement d'index de la colonne dans la clé - il prend en compte la possibilité de clés composées –

+1

Vous pouvez rechercher dans EntityKey.EntityKeyValues ​​et inspecter la propriété EntityKeyMember.Key contenant la clé nom pour trouver la valeur clé que vous recherchez. –

1

pas sûr de votre nom d'objet ici mais vous pouvez saisir la clé de l'entité principale propriété sans aller à la base de données quelque chose comme ceci:

var employee = (from e in context.Employees 
       where e.employeeID = 1 
       select e).FirstOrDefault(); 

//this gets the vendor ID 
int vendorID = (int)employee.tbl_vendorsReference.EntityKey.EntityKeyValues[0].Value; 
5

En fait, ce qui est très simple, vous faites essentiellement ceci:

var tblVendorID = (from e in context.Employees 
        select e.tbl_vendors.ID).FirstOrDefault(); 

Même si cela semble que vous faites une jointure L2E optimisera le rejoindre.

Que vous pouvez confirmer avec le code comme ceci:

var results = from e in ctx.Employees 
       select e.tbl_vendors.ID; 

var query = results as ObjectQuery<int>; 
string sql = query.ToTraceString(); 

Hope this helps Alex (Microsoft).

Questions connexes