13

Przenoszę mój kod .NET Framework (EF6) do Core ASP.NET (EF Core) i natknąłem się na ten problem. Oto przykładowy kod:Używanie EF Core ThenInclude() na tablicach połączeń

W EF6 używam include() i Wybierz() dla chętnych-ładowania:

return _context.Post 
.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests)) 

PostAuthor jest tabela skrzyżowanie i tam jest również stół Junction "AuthorInterest", co ja nie wymagało zaangażowania w EF6 (Select goes goes to a.Interests).

W każdym razie widzę, że w EF7 jest to przerobione, co oznacza, że ​​powinienem teraz użyć funkcji ThenInclude() dla zagnieżdżonych zapytań. Jednak ...

return _context.Post 
    .Include(p => p.PostAuthor) 
    .ThenInclude(pa => pa.Select(pa2 => pa2.Author)) 
...etc 

Powyższy kod nie powiedzie się z powodu select() oświadczenia. Dokumentacja na https://docs.efproject.net/en/latest/querying/related-data.html wydaje się sugerować, że nie jest mi potrzebna i mogę natychmiast uzyskać dostęp do autora, ale otrzymuję ICollection w ostatniej wyświetlonej wartości lambda, więc oczywiście potrzebuję funkcji Select(). Przechodzę przez wiele tabel połączeń dalej w zapytaniu, ale dla uproszczenia po prostu skupmy się na pierwszym.

Jak to działa?

Odpowiedz

22

ale pojawia się w ostatnim ICollection lambda wyświetlane, więc oczywiście trzeba Select()

Nie, nie. Rdzeń EF Include/ThenInclude całkowicie zastępuje potrzebę użycia Select/SelectMany używanego w EF6. Oba mają oddzielne przeciążenia dla właściwości nawigacji kolekcji i odniesienia. Jeśli używasz przeciążenia z kolekcją, ThenInclude działa na typ kolekcji element, więc na końcu zawsze kończy się jeden typ obiektu.

W twoim przypadku, pa powinien rozwiązać twój typ elementu tablicy złącz, więc Author powinien być bezpośrednio dostępny.

Przykładowo EF6 zawierać łańcuch:

.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests)) 

przekłada się EF Rdzeń:

.Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests) 
+4

wow, dzięki. Bardzo dziwne - Visual studio nie dałoby mi intellisense dla pa.Author (zamiast tego sugeruje niektóre metody Linqa) i podkreślił wszystko na czerwono, gdy tylko spróbuję to napisać. Po twoim wpisie zignorowałem VS i po kompilacji wszystko działało jak czar. – nikovn

+1

To dziwne. Używam VS2015 Update 3, i kiedy piszę coś w stylu 'db.Parents.Include (p => p.Children) .ThereInclude (c => c.Child) .TenInclude (c => c.Parents)' I uzyskaj poprawną obsługę IntelliSense przy każdej lambda. –

+0

VS2015 Ultimate Update 3 również tutaj. Nie jestem zaskoczony, mam inne błędy w podstawowych projektach - na przykład gdy wybieram element sugerowany przez intellisense, zapisuję symbole w środku pliku itp. Może to wtyczki ... – nikovn