2009-04-22 11 views
3

Ich benutze die Linq zu Entities. Ich habe meine Haupttabelle Employee Setup mit einem Feld namens VendorID. Lieferanten-ID ist ein Fremdschlüssel in der Lieferantentabelle.Linq zu Entities (EF): Wie bekomme ich den Wert eines FK ohne den Beitritt

Wie es jetzt ist, stellt das Employee-Objekt die VendorID nicht direkt zur Verfügung. Stattdessen kann ich es nur auf diese Weise Zugang:

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; 

Das ist nur schön und gut ist, aber es ist zusätzliche Arbeit auf der Datenbank, weil es zwingt einen Join, wo keine nötig ist. Gibt es eine Möglichkeit, diesen Schlüsselwert zu erhalten, ohne gezwungen zu sein, der Tabelle "tbl_vendors" beizutreten?

Antwort

3

Sie können die Fremdschlüssel über den Entity-Referenz zugreifen.

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

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

Siehe MSDN Referenz auf die EntityReference und EntityKey Klassen.

+0

Also gibt es keine Möglichkeit, es durch den Namen statt durch den Index Speicherort des Schlüssels zu verweisen? Es erscheint gefährlich, den Index zu verwenden, da er möglicherweise geändert werden kann, wenn der Tabelle ein neuer Schlüssel hinzugefügt wird. – bugfixr

+1

Es ist nicht der Index Speicherort des Schlüssels, es ist der Index Speicherort der Spalte innerhalb des Schlüssels - es berücksichtigt die Möglichkeit von zusammengesetzten Schlüsseln –

+1

Sie können durch die EntityKey.EntityKeyValues ​​suchen und überprüfen Sie die EntityKeyMember.Key-Eigenschaft mit dem Schlüssel Name, um den Schlüsselwert zu finden, nach dem Sie suchen. –

1

Nicht sicher über Ihre Objektnamen hier, aber Sie können den Schlüssel aus dem Entitätsschlüssel Eigenschaft greifen, ohne dabei auf die Datenbank etwas wie folgt aus:

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

Eigentlich ist das sehr einfach, dass man dies im Grunde tun:

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

Auch wenn dies sieht aus wie Sie ein L2E beitreten tun wird die Join-Optimierung aus.

, die Sie mit Code wie folgt bestätigen:

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

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

hoffe, das hilft Alex (Microsoft).

Verwandte Themen