web-dev-qa-db-fra.com

Utilisation d'EF Core ThenInclude () sur les tables de jonction

Je transfère mon code .NET Framework (EF6) vers ASP.NET Core (EF Core), et je suis tombé sur ce problème. Voici un exemple de code:

Dans EF6, j'utilise Include () et Select () pour un chargement rapide:

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

PostAuthor est une table de jonction et il y a aussi une table de jonction "AuthorInterest" que je n'avais pas besoin d'impliquer dans EF6 (Select va directement à a.Interests).

Quoi qu'il en soit, je peux voir que dans EF7, cela est retravaillé, ce qui signifie que je devrais utiliser ThenInclude () pour les requêtes imbriquées maintenant. Toutefois...

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

Le code ci-dessus échoue en raison de l'instruction Select (). La documentation sur https://docs.efproject.net/en/latest/querying/related-data.html semble suggérer que je n'en ai pas besoin et que je peux accéder immédiatement à Author, mais je obtenir une ICollection dans la dernière lambda affichée, j'ai donc évidemment besoin de Select (). Je passe par plusieurs tables de jonction plus loin dans la requête, mais pour des raisons de simplicité, concentrons-nous sur la première.

Comment faire pour que ça marche?

28
nikovn

mais j'obtiens une ICollection dans la dernière lambda affichée, j'ai donc évidemment besoin de Select ()

Non, non. EF Core Include/ThenInclude remplace totalement le besoin de Select/SelectMany utilisé dans EF6. Ils ont tous deux des surcharges distinctes pour les propriétés de navigation de type collection et référence. Si vous utilisez la surcharge avec collection, ThenInclude opère sur le type de la collection element, donc à la fin vous vous retrouvez toujours avec un seul type d'entité.

Dans votre cas, pa devrait être résolu en votre type d'élément de table de jonction, donc Author devrait être directement accessible.

Par exemple, la chaîne d'inclusion EF6:

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

se traduit par EF Core:

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