Entity-Framework linq-Abfrage Include () mehrere untergeordnete Entitäten
Dies kann eine wirklich elementry Frage aber was ist ein schöner Weg, um mehrere Kinder Personen beim schreiben einer Abfrage, die sich über DREI Ebenen (oder mehr)?
also ich habe 4 Tabellen: Company
Employee
Employee_Car
und Employee_Country
Unternehmen hat eine 1:m-Beziehung mit den Mitarbeitern.
Mitarbeiter hat eine 1:m-Beziehung mit beiden Employee_Car und Employee_Country.
Will ich eine Abfrage schreiben, die Daten zurück, die aus allen 4 Tabellen, die ich gerade Schreibe:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Da muss es eine elegantere Art und Weise! Dies ist umständlich und erzeugt horrende SQL
Ich bin mit EF4 mit VS 2010
InformationsquelleAutor der Frage Nathan Liu | 2010-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden erweiterungsmethoden.
Ersetzen NameOfContext mit dem Namen Ihres Objekt-Kontext.
Dann Ihren code wird
InformationsquelleAutor der Antwort Nix
EF 4.1 EF 6
Es ist ein stark typisierte
.Include
die es ermöglicht, die erforderliche Tiefe von eager loading angegeben werden, indem Select-Ausdrücke an der entsprechenden Tiefe:Generierte Sql in beiden Fällen ist noch keineswegs intuitiv, aber scheint performant genug. Ich habe ein kleines Beispiel auf GitHub hier
EF-Core
EF-Core hat eine neue Erweiterung Methode,
.ThenInclude()
obwohl die syntax ist etwas anders:Gemäß den docs, ich würde immer die extra 'Einzug' in die
.ThenInclude
bewahren Sie Ihre geistige Gesundheit.Veraltete Info (nicht tun):
Den mehreren Enkeln zu laden könnte erfolgen in einem Schritt, aber dies erfordert einen eher unbeholfenen Umkehrung sichern Sie die Grafik vor der überschrift nach dem nächsten Knoten (NB: Dies funktioniert NICHT mit
AsNoTracking()
- erhalten Sie eine Laufzeit-Fehler):So, ich würde bleiben mit der ersten option (eins pro Blatt Einheit Tiefe Modell).
InformationsquelleAutor der Antwort StuartLC
Finden Sie vielleicht dieser Artikel von Interesse, die verfügbar ist auf codeplex.com.
Der Artikel stellt eine neue Art und Weise auszudrücken, Abfragen, die mehrere Tabellen umfassen, die in form von deklarativen Graphen Formen.
Außerdem enthält der Artikel einen gründlichen Vergleich dieses neuen Ansatzes mit EF-Abfragen. Diese Analyse zeigt, dass GBQ schnell übertrifft EF-Abfragen.
InformationsquelleAutor der Antwort Merijn
Wie erstellen Sie eine LINQ to Entities-Abfrage zu laden, auf untergeordnete Objekte, die direkt anstelle des Aufrufs einer Referenz-Eigenschaft oder Load()
Es gibt keinen anderen Weg - außer der Umsetzung von lazy loading.
Oder manuelle Befüllung....
InformationsquelleAutor der Antwort Andreas Rehm