Ok, mam trzypoziomowe encje z następującą hierarchią: Kurs -> Moduł -> Rozdział
Oto oryginalne oświadczenie EF LINQ:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Single(x => x.Id == id);
Teraz chcę dołączyć inną jednostkę o nazwie Lab, która jest powiązana z kursem.
Jak dołączyć encję Lab?
Próbowałem następujących rzeczy, ale nie zadziałało:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
.Single(x => x.Id == id);
Jakieś pomysły na włączenie drugiej jednostki?
Każda rada lub informacja byłaby bardzo mile widziana. Dzięki!
.Include
powinno działać, chyba że masz na myśli, że dodatkowe dołączenie jest wnukiem Kursu. Zobacz tę lub lepszą opcjęOdpowiedzi:
Czy próbowałeś po prostu dodać kolejny
Include
:Twoje rozwiązanie zawodzi, ponieważ
Include
nie wymaga operatora boolowskiegoAktualizacja Aby dowiedzieć się więcej, pobierz LinqPad i przejrzyj próbki. Myślę, że to najszybszy sposób na zapoznanie się z Linq i Lambdą.
Na początek - różnica między
Select
iInclude
polega na tym, że w przypadku Select decydujesz, co chcesz zwrócić (czyli projekcja). Include to funkcja Eager Loading , która informuje Entity Framework, że chcesz, aby zawierała dane z innych tabel.Składnia Include może być również w postaci ciągu. Lubię to:
Ale próbki w LinqPad wyjaśniają to lepiej.
źródło
.Include("Module.Chapter")
. Każdy pomysł, dlaczego miałoby to być?System.Data.Enity
aby uzyskać dostęp do metody rozszerzenia. więcej informacji tutajusing System.Data.Entity;
zrobił to. Dzięki!W Entity Framework Core (
EF.core
) można używać.ThenInclude
do dołączania kolejnych poziomów.Więcej informacji: https://docs.microsoft.com/en-us/ef/core/querying/related-data
Uwaga: powiedz, że potrzebujesz wielu
ThenInclude()
włączonychblog.Posts
, po prostu powtórzInclude(blog => blog.Posts)
i wykonaj innąThenInclude(post => post.Other)
.źródło
ThenInclude
w rdzeniu EF. Może zadaj pytanie z dobrym przykładem, abyśmy mogli na nie odpowiedzieć.Include
jest częścią płynnego interfejsu, dzięki czemu można napisać wieleInclude
instrukcji następujących po sobieźródło
Możesz też spróbować
źródło
Można napisać taką metodę rozszerzającą:
I używaj go w ten sposób nawet w ogólnej implementacji:
źródło
Include