uselazyloadingproxies then related query queries lazy framework entity-framework asp.net-core asp.net-core-mvc entity-framework-core

entity framework - related - Uso de EF Core ThenInclude() en tablas de unión



query entity framework core (1)

Estoy transfiriendo mi código .NET Framework (EF6) a ASP.NET Core (EF Core), y me topé con este problema. Aquí hay un código de ejemplo:

En EF6 utilizo Include () y Select () para cargar datos:

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

PostAuthor es una tabla de conexiones y también hay una tabla de conexiones "AuthorInterest" que no necesitaba involucrar en EF6 (Select va directamente a a.Interests).

De todos modos, puedo ver que en EF7 esto está revisado, lo que significa que debería usar ThenInclude () para consultas anidadas ahora. Sin embargo...

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

El código anterior falla debido a la declaración Select (). La documentación en https://docs.efproject.net/en/latest/querying/related-data.html parece sugerir que no la necesito y puedo acceder a Autor de inmediato, pero recibí una ICollection en el último lambda mostrado, así que obviamente necesito el Select (). Paso a través de varias tablas de unión más adelante en la consulta, pero para simplificar, concentrémonos en la primera.

¿Cómo hago este trabajo?


pero obtengo un ICollection en la última lambda mostrada, así que obviamente necesito el Select ()

No tu no EF Core Include / ThenInclude reemplaza totalmente la necesidad de Select / SelectMany utilizada en EF6. Ambos tienen sobrecargas separadas para las propiedades de navegación de colección y de tipo de referencia. Si usa la sobrecarga con la colección, ThenInclude opera con el tipo de elemento de la colección, por lo que al final siempre terminará con un solo tipo de entidad.

En su caso, pa debería resolver el tipo de elemento de la tabla de unión, por lo que Author debería ser directamente accesible.

Por ejemplo, la cadena incluye EF6:

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

se traduce a EF Core:

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