2011-03-21 12 views
15

Si tengo el siguiente modelo de clase ...EF 4.1, Código-Primero: Con ganas de carga de las colecciones en cascada

public class A 
{ 
    public int AId { get; set; } 
    public ICollection<B> BCollection { get; set; } 
} 

public class B 
{ 
    public int BId { get; set; } 
    public ICollection<C> CCollection { get; set; } 
} 

public class C 
{ 
    public int CId { get; set; } 
} 

... ¿es posible ansiosos-cargar un objeto de tipo A de la base de datos con todas las colecciones en cascada incluidas?

que puede incluir la BCollection así:

A a = context.ASet.Where(x => x.AId == 1) 
      .Include(x => x.BCollection) 
      .FirstOrDefault(); 

¿Puedo también incluir de alguna manera el CCollection de todos los objetos cargados B de modo que consiga A con todos los objetos dependientes en la memoria con una sola consulta de base de datos?

+0

Comencé esta pregunta en meta: http://meta.stackexchange.com/questions/85358/how-to-use-version-specific-tags Está relacionado con nuestra comunicación anterior sobre las etiquetas específicas de la versión en EF. –

+0

@Ladislav: OK, voy a ver esto. Veamos cómo lo piensan los veteranos. – Slauma

Respuesta

22

Utilice .Include(x => x.BCollection.Select(b => b.CCollection)) también described here.

Funciona también para cascada. Cada vez que necesite cargar la propiedad de navegación de carga que es colección, use .Select.

+0

¡Gracias! Y para las jerarquías incluso más profundas, simplemente encadenaré los Selects de la siguiente manera: '.Include (x => x.BCollection.Select (b => b.CCollection.Select (c => c.DCollection)))', ¿no? – Slauma

+1

@Slauma Sí, pero la selección encadenada debe ser el único elemento que se seleccione por primera vez. No puede seleccionar una sola entidad y una colección al mismo tiempo. Malo, por ejemplo: .Include (x => x.BCollection.Select (b => new {b.ChildEntity, b.CCollection.Select (c => c.DCollection)})) – Monstieur

Cuestiones relacionadas