在EF Query中包含孙子孙女

Eri*_* J. 24 linq-to-entities entity-framework

给定对象层次结构

public class Parent
{
    public int Id { get; set; }
    public virtual Child Child { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public virtual GrandChild GrandChild { get; set; }
}

public class GrandChild
{
    public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和DB上下文

public class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

可以包括使用Lambda语法(using System.Data.Entity)的子孙,如下所示:

using (MyContext ctx = new MyContext())
{
    var hierarchy = 
        from p in ctx.Parents.Include(p => p.Child.GrandChild) select p;
}
Run Code Online (Sandbox Code Playgroud)

如果随后更改了类名,则Lambda语法可以防止破坏查询.但是,如果ParentICollection<Child>这样的话:

public class Parent
{
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Lambda语法不再有效.相反,可以使用字符串语法:

var hierarchy = from p in ctx.Parents.Include("Children.GrandChild") select p;
Run Code Online (Sandbox Code Playgroud)

字符串语法是唯一的选择,还是在这种情况下有一些替代方法来使用Lambda语法?

Ger*_*old 35

当然,你可以做到

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children.Select(c => c.GrandChild))
                select p;
Run Code Online (Sandbox Code Playgroud)

参见MSDN,标题备注,第五个项目符号.

  • 如果孙子有孩子等,您也可以为后代递归地继续此 Select() 模式。 (3认同)
  • 要使用这样的include方法,请不要忘记引用`System.Data.Entity`. (2认同)

小智 25

更新:如果您使用的是Entity Framework Core,则应使用以下语法

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children)
                    .ThenInclude(c => c.GrandChild)
                select p;
Run Code Online (Sandbox Code Playgroud)

  • 注意:在我的情况下,由于一些奇怪的原因,intellisense不会在".ThenInclude"lambda子句中提示我使用Grandchild对象,但这是一个边缘情况,其中intellisense是错误的并且无关紧要 - 代码仍然编译. (8认同)
  • 您如何将两个不同的孙子(例如孙子和孙女)包括在内?像“ctx.Parents.Include(p =&gt; p.Children).ThenInclude(c =&gt; c.GrandSon)...”这样的东西开始。您无法添加“ThenInclude(c =&gt; c.GrandDaughter)”,因为它会在 GrandSon 对象中查找 GrandDaughter。 (4认同)
  • @SimonTewsi 不幸的是,现在唯一的方法是第二次“.Ininclude”顶层,然后对您想要包含的另一个子项执行另一个“.ThenInclude”。 (3认同)
  • @Julen 您可以为每个嵌套的子实体递归使用 .ThenInclude,如下所示: Parent.Include(child).ThenInclude(GrandChild).ThenInclude(GrandGrandChild) .. 等 (2认同)