To może być naprawdę elementarne pytanie, ale jaki jest dobry sposób na uwzględnienie wielu jednostek podrzędnych podczas pisania zapytania obejmującego TRZY poziomy (lub więcej)?
czyli mam 4 tabel: Company
, Employee
, Employee_Car
iEmployee_Country
Firma ma relację 1: m z pracownikiem.
Pracownik ma relację 1: m zarówno z Employee_Car, jak i Employee_Country.
Jeśli chcę napisać zapytanie, które zwraca dane ze wszystkich 4 tabel, obecnie piszę:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Musi być bardziej elegancki sposób! To jest rozwlekłe i generuje horrendalny SQL
Używam EF4 z VS 2010
linq
entity-framework
lazy-loading
Nathan Liu
źródło
źródło
//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 do EF 6
Istnieje silnie typizowany typ,
.Include
który umożliwia określenie wymaganej głębokości zachłannego ładowania przez podanie wyrażeń Select na odpowiednią głębokość:Sql wygenerowany w obu przypadkach nadal nie jest intuicyjny, ale wydaje się wystarczająco wydajny. Umieściłem tutaj mały przykład na GitHubie
EF Core
EF Core ma nową metodę rozszerzenia
.ThenInclude()
, chociaż składnia jest nieco inna :Zgodnie z dokumentacją, chciałbym zachować dodatkowe „wcięcie” w
.ThenInclude
celu zachowania zdrowia psychicznego.Przestarzałe informacje (nie rób tego):
Wczytanie wielu wnuków można wykonać w jednym kroku, ale wymaga to raczej niezręcznego odwrócenia wykresu przed przejściem do następnego węzła (uwaga: to NIE działa
AsNoTracking()
- pojawi się błąd w czasie wykonywania):Więc pozostałbym przy pierwszej opcji (jeden model Uwzględnij na głębokość elementu liścia).
źródło
Może zainteresować Cię ten artykuł, który jest dostępny pod adresem codeplex.com .
W artykule przedstawiono nowy sposób wyrażania zapytań obejmujących wiele tabel w postaci deklaratywnych kształtów wykresów.
Ponadto artykuł zawiera dokładne porównanie wydajności tego nowego podejścia z zapytaniami EF. Ta analiza pokazuje, że GBQ szybko przewyższa zapytania EF.
źródło
Jak skonstruować zapytanie LINQ to Entities w celu bezpośredniego załadowania obiektów podrzędnych, zamiast wywoływania właściwości Reference lub Load ()
Nie ma innego wyjścia - poza implementacją leniwego ładowania.
Lub ładowanie ręczne ...
źródło