2013-02-10 18 views
17

die Objekthierarchie GegebenFügen Enkelkinder in EF Abfrage

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

und der DB Kontext

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

Man kann Kinder und Enkel mit Lambda-Syntax (using System.Data.Entity) wie folgt sind:

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

Die Lambda-Syntax verhindert das Brechen der Abfrage, wenn die Klassennamen später sind verändert. Wenn jedoch Parent hat eine ICollection<Child> wie diese statt:

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

Lambda-Syntax nicht mehr funktioniert. Stattdessen kann man die Zeichenfolge Syntax:

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

Ist die Zeichenfolge, die die einzige Option Syntax, oder gibt es eine alternative Art und Weise Lambda-Syntax in dieser Situation zu benutzen?

Antwort

29

Sicher, können Sie tun,

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

Siehe MSDN, Beschriftung Bemerkungen, die fünfte Kugel.

+0

Upvote verwenden. Vielen Dank, dass Sie auch den MSDN-Link hinzugefügt haben. – granadaCoder

12

Update: Wenn Sie Entity Framework-Core verwenden sollten Sie die folgende Syntax

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

Hinweis: In meinem Fall würde mich intellisense aus irgendeinem seltsamen Grund nicht mit dem Enkelkind-Objekt in der ".ThenInclude" -Lambda-Klausel auffordern, aber dies war ein Randfall, in dem Intellisense falsch war und es nichts ausmachte - der Code immer noch kompiliert. –

Verwandte Themen