El método Include () funciona bastante bien para listas en objetos. ¿Pero qué pasa si necesito ir a dos niveles de profundidad? Por ejemplo, el siguiente método devolverá ApplicationServers con las propiedades incluidas que se muestran aquí. Sin embargo, ApplicationsWithOverrideGroup es otro contenedor que contiene otros objetos complejos. ¿Puedo hacer un Incluir () en esa propiedad también? ¿O cómo puedo hacer que esa propiedad se cargue completamente?
Tal como está ahora, este método:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Rellenará solo la propiedad Enabled (a continuación) y no las propiedades Application o CustomVariableGroup (a continuación). ¿Cómo hago que esto suceda?
public class ApplicationWithOverrideVariableGroup : EntityBase
{
public bool Enabled { get; set; }
public Application Application { get; set; }
public CustomVariableGroup CustomVariableGroup { get; set; }
}
c#
entity-framework
eager-loading
Bob Horn
fuente
fuente
Expression must be a member expression
cuando intento esto: Para incluir una colección y luego un nivel de colección de uno abajo:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Respuestas:
Para EF 6
Asegúrate de agregar
using System.Data.Entity;
para obtener la versiónInclude
que toma una lambda.Para EF Core
Usa el nuevo método
ThenInclude
fuente
Include
para cada propiedad:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Si te entiendo correctamente, estás preguntando sobre la inclusión de propiedades anidadas. Si es así :
o
o
fuente
Include(string path)
versión del método.EF Core: Usando "ThenInclude" para cargar niveles múltiples: Por ejemplo:
fuente
Hice un pequeño ayudante para Entity Framework 6 (.Net Core style), para incluir subentidades de una manera agradable.
Ahora está en NuGet: Install-Package ThenInclude.EF6
El paquete está disponible en GitHub .
fuente
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
con el único inconveniente de que está calculando un producto cartesiano y potencialmente aumentando el ancho de banda.Más ejemplos de EFCore en MSDN muestran que puede hacer algunas cosas bastante complejas con
Include
yThenInclude
.Este es un buen ejemplo de lo complejo que puede ser (¡esta es una sola declaración!):
Vea cómo puede encadenar
Include
incluso despuésThenInclude
y de alguna manera lo 'restablece' al nivel de la entidad de nivel superior (Instructores).Incluso puede repetir la misma colección de 'primer nivel' (Asignaciones de curso) varias veces, seguido de
ThenIncludes
comandos separados para llegar a diferentes entidades secundarias.Tenga en cuenta que su consulta real debe estar etiquetada en el final de la cadena
Include
oThenIncludes
. Lo siguiente NO funciona:Le recomiendo que configure el registro y asegúrese de que sus consultas no estén fuera de control si incluye más de una o dos cosas. Es importante ver cómo funciona realmente, y notará que cada 'inclusión' por separado suele ser una nueva consulta para evitar uniones masivas que devuelven datos redundantes.
AsNoTracking
puede acelerar mucho las cosas si no tiene la intención de editar las entidades y volver a guardarlas.fuente
También tuve que usar varias inclusiones y en el 3er nivel necesitaba múltiples propiedades
Esto puede ayudar a alguien :)
fuente
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Permítame decirle claramente que puede usar la sobrecarga de cadena para incluir niveles anidados independientemente de las multiplicidades de las relaciones correspondientes, si no le importa usar literales de cadena:
fuente
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...