2011-05-11 1206 views
22

Dado el siguiente modelo ...carga explícita de las colecciones nieto de la FE 4.1

public class Parent 
{ 
    public int Id { get; set; } 
    public ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public ICollection<Grandchild> Grandchildren { get; set; } 
} 

public class Grandchild 
{ 
    public int Id { get; set; } 
} 

... podemos carga ansiosa con Include un Parent con toda Children y Grandchildren en un solo paso, así:

context.Parents.Include(p => p.Children.Select(c => c.Grandchildren)) 

Es posible para cargando de forma explícita?

La colección infantil se puede cargar explícitamente de esta manera:

Parent parent = context.Parents.Find(parentId); 
context.Entry(parent).Collection(p => p.Children).Load(); 

Pero tratar de cargar a los niños de una manera similar como con Include ...

context.Entry(parent) 
    .Collection(p => p.Children.Select(c => c.Grandchildren)).Load(); 

... no lo hace Recopilar und la sobrecarga de la cadena de Collection ...

context.Entry(parent).Collection("Children.Grandchildren").Load(); 

... lanza una excepción ("... no hay rutas de puntos permitidas ...").

Lo único que encontré trabajo es cargar explícitamente el Grandchildren en un bucle:

Parent parent = context.Parents.Find(parentId); 
context.Entry(parent).Collection(p => p.Children).Load(); 
foreach (var child in parent.Children) 
    context.Entry(child).Collection(c => c.GrandChildren).Load(); 

Me pregunto si me he perdido algo y si hay alguna otra forma de cargar explícitamente el GrandChildren en una ida y vuelta .

Gracias por votar con antelación!

+0

¿Has probado 'Collection (...). Query(). Include (...). Load()'? Si no funciona tan bien, me temo que no es compatible. Generalmente 'Load' es equivalente a manejar' RelatedEnd.Load' desde ObjectContext API. –

+0

@Ladislav: Por favor, pon esto en una respuesta :) ¡Funciona! – Slauma

Respuesta

20

Como indiqué en el comentario, primero puede tratar de obtener una consulta para la relación, luego agregar incluye y ejecutar la carga. Algo como:

context.Entry(parent) 
     .Collection(p => p.Children) 
     .Query() 
     .Include(c => c.Grandchildren) // I'm not sure if you can include grandchild directly 
     .Load(); 
+0

Sí, eso es exactamente lo que probé después de tu comentario, y funciona. Abre la pregunta, si también puede cargar "GrandGrandChildren" con 'Include (... Select (...))' y así sucesivamente. Pero supongo que funcionará también. Gracias por esta solución! – Slauma

+0

Acabo de probar el código con su 'IncludeMultiple' (en lugar de simple Include) desde aquí (http://stackoverflow.com/questions/5376421/ef-including-other-entities-generic-repository-pattern/5376637# 5376637) con "GrandGrandChildren" y "SomeReferenceInGrandChild" ¡y funciona también! – Slauma

+0

Debería funcionar porque 'Query()' devuelve 'ObjectQuery' implementando' IQueryable' por lo que es una consulta EF como cualquier otra solo con alguna condición predefinida. –

Cuestiones relacionadas