wake-up-neo.com

Verwenden von EF Core ThenInclude () für Junction-Tabellen

Ich übertrage meinen .NET Framework-Code (EF6) auf ASP.NET Core (EF Core) und bin auf dieses Problem gestoßen. Hier ist ein Beispielcode:

In EF6 verwende ich Include () und Select () zum eifrigen Laden:

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

PostAuthor ist eine Junction-Tabelle und es gibt auch eine Junction-Tabelle "AuthorInterest", die ich nicht in EF6 einbeziehen musste (Select geht direkt zu a.Interests).

Wie auch immer, ich kann sehen, dass dies in EF7 überarbeitet wird, was bedeutet, dass ich ThenInclude () jetzt für verschachtelte Abfragen verwenden sollte. Jedoch...

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

Der obige Code schlägt aufgrund der Select () - Anweisung fehl. Die Dokumentation unter https://docs.efproject.net/en/latest/querying/related-data.html scheint darauf hinzudeuten, dass ich sie nicht brauche und sofort auf Author zugreifen kann, aber ich bekomme eine icollection im letzten lambda angezeigt, daher brauche ich natürlich die select (). Ich gehe weiter unten in der Abfrage mehrere Junction-Tabellen durch, aber der Einfachheit halber konzentrieren wir uns nur auf die erste.

Wie mache ich das?

28
nikovn

aber ich bekomme eine icollection im letzten lambda angezeigt, also brauche ich natürlich die select ()

Nein, tust du nicht. EF Core Include/ThenInclude ersetzt vollständig die in EF6 verwendeten Select/SelectMany. Beide haben separate Überladungen für Navigationsmerkmale für Auflistung und Referenztyp. Wenn Sie die Überladung mit collection verwenden, arbeitet ThenInclude mit dem Typ der collection element, sodass Sie am Ende immer einen einzelnen Entitätstyp erhalten.

In Ihrem Fall sollte pa in Ihren Junction-Tabellenelementtyp aufgelöst werden, sodass auf Author direkt zugegriffen werden kann.

Zum Beispiel die EF6-Include-Kette:

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

übersetzt in EF Core:

.Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests)
45
Ivan Stoev