在EF 4.1中显式加载孙子集合

Sla*_*uma 22 .net entity-framework entity-framework-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; }
}
Run Code Online (Sandbox Code Playgroud)

...我们能渴望负载Include一个Parent与所有ChildrenGrandchildren一步到位,像这样:

context.Parents.Include(p => p.Children.Select(c => c.Grandchildren))
Run Code Online (Sandbox Code Playgroud)

显式加载有类似的可能吗?

可以通过以下方式明确加载子集合:

Parent parent = context.Parents.Find(parentId);
context.Entry(parent).Collection(p => p.Children).Load();
Run Code Online (Sandbox Code Playgroud)

但试图以与Include... 类似的方式加载孩子

context.Entry(parent)
    .Collection(p => p.Children.Select(c => c.Grandchildren)).Load();
Run Code Online (Sandbox Code Playgroud)

...不编译和字符串重载Collection...

context.Entry(parent).Collection("Children.Grandchildren").Load();
Run Code Online (Sandbox Code Playgroud)

...引发异常("......不允许虚线路径......").

我发现唯一有用的是明确加载Grandchildren循环:

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();
Run Code Online (Sandbox Code Playgroud)

我想知道我是否错过了什么,如果有其他方法明确加载GrandChildren一次往返.

感谢您的反馈!

Lad*_*nka 20

正如我在评论中指出的那样,您可以尝试先获取关系查询,然后添加包含并执行加载.就像是:

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