29

给定对象层次结构

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; }
}

和数据库上下文

public class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
}

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

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

如果随后更改类名称,Lambda 语法可防止中断查询。但是,如果ParentICollection<Child>这样的代替:

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

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

var hierarchy = from p in ctx.Parents.Include("Children.GrandChild") select p;

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

4

2 回答 2

40

当然,你可以做到

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children.Select(c => c.GrandChild))
                select p;

请参阅MSDN,标题备注,第五个项目符号。

于 2013-02-10T22:30:35.547 回答
40

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

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children)
                    .ThenInclude(c => c.GrandChild)
                select p;
于 2016-08-03T11:10:11.857 回答