2016-08-05 2 views
0

Ich habe zwei Tabellen:Wie EF Klasse Last und es ist relationale Klassen

MY_TABLE 
ID CODE VERSION DESCRIPTION 
1 AAA 1  A Test 

MY_CHILD_TABLE 
ID CODE VERSION COLOR 
1 AAA 1  Blue 

Beide sind in meinem EF Modell enthält und es gibt eine Navigationseigenschaft Setup auf beiden Tabellen.

Jetzt habe ich die folgende Klasse, die Daten zu erhalten:

public static MyData GetMyData(string Code, string version) 
{ 
    using (var context = new Entities()) 
    { 
     return context.MY_TABLE.Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault(); 
    } 
} 

Das ist in Ordnung, wenn ich nur die Daten für MY_TABLE will. Allerdings habe ich jetzt ein Szenario, wo ich sowohl MY_TABLE und MY_CHILD_TABLE Daten zurückgegeben werden soll.

Wie kann ich diese Informationen zurückgeben?
d.h ich zu etwas in der Lage sein will:

var result = MyClass.GetMyData("aaa",1); 
var color = result.NAV_PROP.Color; 

Wenn ich das richtig verstanden, funktioniert das nicht, weil ich den Kontext, in dem GetMyData Verfahren am schließen.

Antwort

1

Es gibt zwei Möglichkeiten, das zu tun, sobald Sie Lazy Loading aktiviert (die Standardeinstellung auf EF ist).

1) Verwenden Sie die Erweiterung "Include"

context.Table.Include(t => t.RelatedTable).Where(x => ..Condition..).FirstOrDefault(); 

Wenn Ihre Beziehung eine "Required" Fremdschlüsselbeziehung zu sein, konfiguriert ist, wird EF verstehen Sie tun "Inner Join"

Wenn Ihre Beziehung als "Nullable" konfiguriert ist (nicht erforderlich), wird EF verstehen, dass Sie eine "Linke Verknüpfung" durchführen.

2) Wählen Sie die verwandten Daten mit einem. Wählen Sie, bevor die Daten aufgelistet werden.

context.Table.Where(x = ..Conditions..).Select(s => 
    new { 
      RelatedTableColumn = s.RelatedTable.Column 
      ... 
    }).FirstOrDefault(); 

Auf diesem Fall EF verstehen Sie tun ein wie mit „Include“ „Inner Join“, aber es wird nur Ihre „Selected“ Spalten zurückgeben, die für größere Abfragen in eine bessere Leistung zur Folge hat.

Edit 1

Ps *: Wenn Sie nicht ".INCLUDE" Erweiterung zugreifen können, fügen Sie einfach:

using System.Data.Entity; 
1

Wenn Sie Navigationseigenschaften haben, sind sie nur:

return context.MY_TABLE.Include(x=>x.MY_CHILD_TABLEProperty).Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault(); 
+0

Ich habe keinen Wert für x in meinem Verfahren einschließen. – PrivateJoker

+0

Sie haben gesagt, dass Sie Navigationseigenschaften haben. Zeigen Sie uns Ihre ef Klassen Struktur –

+1

@JDS fügen Sie die Referenz hinzu: using System.Data.Entity; –

Verwandte Themen