Dies mag eine wirklich elementare Frage sein, aber was ist eine gute Möglichkeit, mehrere untergeordnete Entitäten einzuschließen, wenn Sie eine Abfrage schreiben, die DREI Ebenen (oder mehr) umfasst?
dh ich habe 4 Tabellen: Company
, Employee
, Employee_Car
undEmployee_Country
Das Unternehmen hat eine 1: m-Beziehung zum Mitarbeiter.
Der Mitarbeiter hat eine 1: m-Beziehung zu Employee_Car und Employee_Country.
Wenn ich eine Abfrage schreiben möchte, die die Daten aus allen 4 Tabellen zurückgibt, schreibe ich gerade:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Es muss einen eleganteren Weg geben! Dies ist langwierig und erzeugt horrendes SQL
Ich verwende EF4 mit VS 2010
linq
entity-framework
lazy-loading
Nathan Liu
quelle
quelle
//inside public static class Extensions public static IQueryable<Company> CompleteCompanies(this DbSet<Company> table){ return table .Include("Employee.Employee_Car") .Include("Employee.Employee_Country") ; } //code will be... Company company = context.Companies.CompleteCompanies().FirstOrDefault(c => c.Id == companyID); //same for next advanced method
EF 4.1 bis EF 6
Es ist eine stark getippte
.Include
, mit dem die erforderliche Tiefe des eifrigen Ladens angegeben werden kann, indem Select-Ausdrücke in der entsprechenden Tiefe bereitgestellt werden:Das in beiden Fällen generierte SQL ist noch keineswegs intuitiv, scheint aber performant genug zu sein. Ich habe ein kleines Beispiel gegeben GitHub gesetzt
EF Core
EF Core hat eine neue Erweiterungsmethode
.ThenInclude()
, obwohl die Syntax etwas anders ist :Gemäß den Dokumenten würde ich den zusätzlichen Einzug in der behalten
.ThenInclude
, um Ihre geistige Gesundheit zu bewahren.Veraltete Informationen (Tun Sie dies nicht):
Das Laden mehrerer Enkelkinder könnte in einem Schritt erfolgen, dies erfordert jedoch eine ziemlich umständliche Umkehrung des Diagramms, bevor der nächste Knoten heruntergefahren wird (Hinweis: Dies funktioniert NICHT
AsNoTracking()
- Sie erhalten einen Laufzeitfehler):Ich würde also bei der ersten Option bleiben (ein Include pro Blattentitätstiefenmodell).
quelle
Möglicherweise finden Sie diesen Artikel von Interesse, der unter codeplex.com verfügbar ist .
Der Artikel bietet eine neue Möglichkeit, Abfragen, die mehrere Tabellen umfassen, in Form von deklarativen Diagrammformen auszudrücken.
Darüber hinaus enthält der Artikel einen gründlichen Leistungsvergleich dieses neuen Ansatzes mit EF-Abfragen. Diese Analyse zeigt, dass GBQ EF-Abfragen schnell übertrifft.
quelle
Wie erstellen Sie eine LINQ to Entities-Abfrage, um untergeordnete Objekte direkt zu laden, anstatt eine Referenzeigenschaft oder Load () aufzurufen?
Es gibt keinen anderen Weg - außer das verzögerte Laden zu implementieren.
Oder manuelles Laden ....
quelle