Metoda Include () działa całkiem dobrze w przypadku list na obiektach. Ale co, jeśli muszę zejść dwa poziomy w głąb? Na przykład poniższa metoda zwróci ApplicationServers z dołączonymi właściwościami pokazanymi tutaj. Jednak ApplicationsWithOverrideGroup to kolejny kontener, w którym przechowywane są inne złożone obiekty. Czy mogę wykonać Include () również dla tej właściwości? Lub w jaki sposób mogę w pełni załadować tę właściwość?
W obecnej postaci ta metoda:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Zapełni tylko właściwość Enabled (poniżej), a nie właściwości Application lub CustomVariableGroup (poniżej). Jak to zrobić?
public class ApplicationWithOverrideVariableGroup : EntityBase
{
public bool Enabled { get; set; }
public Application Application { get; set; }
public CustomVariableGroup CustomVariableGroup { get; set; }
}
c#
entity-framework
eager-loading
Bob Horn
źródło
źródło
Expression must be a member expression
, gdy próbuję to: Aby dołączyć kolekcję a potem zbieranie jeden poziom w dół:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Odpowiedzi:
Dla EF 6
Pamiętaj, aby dodać,
using System.Data.Entity;
aby uzyskać wersję,Include
która przyjmuje lambda.Dla EF Core
Użyj nowej metody
ThenInclude
źródło
Include
do każdej nieruchomości:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Jeśli dobrze cię rozumiem, pytasz o włączenie zagnieżdżonych właściwości. Jeśli tak:
lub
lub
źródło
Include(string path)
wersję metody.EF Core: Używanie „ThenInclude” do ładowania wielu poziomów: Na przykład:
źródło
Zrobiłem małego pomocnika dla Entity Framework 6 (styl .Net Core), aby ładnie włączać pod-byty.
Jest teraz w NuGet: Install-Package ThenInclude.EF6
Pakiet jest dostępny na GitHub .
źródło
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
z tą jedyną wadą, że obliczasz produkt kartezjański i potencjalnie zwiększasz przepustowość.Więcej przykładów EFCore na MSDN pokazuje, że możesz robić dość skomplikowane rzeczy przy pomocy
Include
iThenInclude
.To dobry przykład tego, jak bardzo możesz się skomplikować (to wszystko jedno zdanie!):
Zobacz, jak możesz łączyć w łańcuchy,
Include
nawet po,ThenInclude
a to „resetuje” cię z powrotem do poziomu jednostki najwyższego poziomu (Instruktorzy).Możesz nawet powtórzyć tę samą kolekcję „pierwszego poziomu” (CourseAssignments) wiele razy, a następnie osobne
ThenIncludes
polecenia, aby dostać się do różnych encji potomnych.Uwaga: Twoje zapytanie musi być oznaczone na końcu łańcucha
Include
lubThenIncludes
. Następujące NIE działa:Zdecydowanie zalecamy skonfigurowanie rejestrowania i upewnienie się, że zapytania nie wymkną się spod kontroli, jeśli podajesz więcej niż jedną lub dwie rzeczy. Ważne jest, aby zobaczyć, jak to naprawdę działa - a zauważysz, że każde „dołączenie” jest zwykle nowym zapytaniem, aby uniknąć masowego łączenia zwracającego zbędne dane.
AsNoTracking
może znacznie przyspieszyć, jeśli nie zamierzasz edytować elementów i ponownie zapisywać.źródło
Musiałem także użyć wielu dołączeń i na 3. poziomie potrzebowałem wielu właściwości
To może komuś pomóc :)
źródło
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Pozwólcie, że jasno stwierdzę, że można użyć przeciążenia łańcucha, aby uwzględnić poziomy zagnieżdżone, niezależnie od mnogości odpowiednich relacji, jeśli nie przeszkadza ci użycie literałów łańcucha:
źródło
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...