2013-02-10 8 views
17

Với đối tượng phân cấpBao gồm Cháu ở EF Query

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

và bối cảnh DB

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

Người ta có thể bao gồm con cháu sử dụng Lambda cú pháp (using System.Data.Entity) như thế này:

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

Cú pháp Lambda ngăn chặn truy vấn nếu tên lớp là sau đó thay đổi. Tuy nhiên, nếu ParentICollection<Child> như thay vì điều này:

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

Lambda cú pháp không còn hoạt động. Thay vào đó, người ta có thể sử dụng cú pháp chuỗi:

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

Cú pháp chuỗi là tùy chọn duy nhất, hoặc có cách nào khác để sử dụng cú pháp Lambda trong tình huống này?

Trả lời

29

Chắc chắn, bạn có thể làm

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

Xem MSDN, chú thích chú, viên đạn thứ năm.

+0

Upvote. Cảm ơn bạn đã bao gồm liên kết MSDN. – granadaCoder

12

Cập nhật: Nếu bạn đang sử dụng Entity Framework Lõi bạn nên sử dụng cú pháp sau

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

Lưu ý: Trong trường hợp của tôi, vì một số lý do kỳ lạ, intellisense sẽ không nhắc tôi với đối tượng Grandchild trong mệnh đề lambda ".ThenInclude", nhưng đây là một trường hợp cạnh intellisense sai và nó không quan trọng - mã vẫn biên soạn. –