2013-02-10 4 views
17

Biorąc pod uwagę hierarchii obiektówDołącz Wnuki w EF Zapytanie

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

i kontekst DB

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

Można to dzieci i wnuki pomocą Lambda składni (using System.Data.Entity) tak:

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

Składnia Lambda zapobiega zerwaniu zapytania, jeśli nazwy klas są następnie zmieniony. Jednakże, jeśli Parent ma ICollection<Child> tak zamiast:

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

składnia Lambda już nie działa. Zamiast tego można użyć składni wyrażenie:

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

jest ciąg składni jedyną opcją, czy jest jakiś alternatywny sposób na wykorzystanie składni Lambda w tej sytuacji?

Odpowiedz

29

Oczywiście, można zrobić

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

Zobacz MSDN, podpis Uwagi, piąty pocisk.

+0

upvote. Dziękujemy za uwzględnienie linku MSDN. – granadaCoder

12

Aktualizacja: Jeśli używasz Entity Framework Rdzeń należy użyć następującej składni

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

Uwaga: W moim przypadku, z jakiegoś dziwnego powodu, intellisense nie zaprosiłoby mnie z obiektem Grandchild w klauzuli lambda ".ThenInclude", ale było to przypadek, w którym intellisense było złe i nie miało to znaczenia - kod nadal skompilowany. –