2016-04-15 7 views
2

Ich kann nicht scheinen, herauszufinden, was ich denke, sollte eine leichte Aufgabe sein. Alle Posts, die ich gefunden habe, scheinen nur die Kinder zurückzubringen oder helfen nicht mit der Null. Ich habe die folgenden KlassenWie wählt man eine übergeordnete und eine gefilterte Liste von Kindern, wenn sie existieren (äußere Verbindung)

public class Parent 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual List<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int isCurrent { get; set; } 
} 

ich EF bin mit und ich möchte ein bestimmt Eltern zurückzukehren und das aktuellen Kind wenn es existiert. Für mich ist das wie ein Left Outer Join. Ich möchte Methodenerweiterungen verwenden, da ich gerne verstehen würde, wie sie etwas besser funktionieren.

Hier ist ein paar Pseudo-Code, den ich ausprobiert habe. Ich scheine es nicht zu bekommen, einen Elternteil zurückzubringen, selbst wenn sie kein aktuelles Kind haben.

var test = db.Parents 
       .Where(p => p.ID == 1) 
       .Select(p => p.Children.Where(c => c.isCurrent == 1).DefaultIfEmpty()        
       ); 

Ich möchte es ein übergeordnetes Objekt zurückzukehren und es ist Kinder zu Sammlung nur mit dem aktuellen Kind bevölkert werden, wenn er eine hat.

+0

ich suche um und dies scheint ähnlich. Verwendet jedoch keine Methodenerweiterungen. Ich bin mir nicht sicher, ob es einen Vorteil auf die eine oder andere Art gibt. http://stackoverflow.com/questions/9705463/linq-to-entity-framework-return-a-list-of-parents-with-only-a-subset-or-empty-co – Andrew

+0

"* und die aktuelle * * Kind ** wenn es existiert * "Sagst du, dass nur ein Kind aktuell sein kann? –

+0

Ich denke, das ist die wöchentliche Inkarnation der gefilterten Include-Frage. Wahrscheinlich ein Duplikat von [this] (http://stackoverflow.com/q/16798796/861716) (oder vielen anderen). –

Antwort

1

können Sie erreichen, auch das, was Sie wollen, wenn Sie Explicit Loading verwenden:

var parent=db.Parents.FirstOrDefault(p=>p.ID==1); 
context.Entry(parent) 
     .Collection(p => p.Children) 
     .Query() 
     .Where(c => c.isCurrent==1) 
     .Load(); 
+0

das ist interessant, ich werde es versuchen. das ist nur komisch für mich, dass das nicht einfacher ist. – Andrew

+0

Dies endete für mich arbeiten. Wieder scheint dies eine allgemeine Frage zu sein, immer noch überrascht, dass es nicht ein bisschen einfacher war. – Andrew

+0

Ja, Filter in den Includes ist immer noch eine Einschränkung; ( – octavioccl

2

Wenn Sie EF Navigationseigenschaften (wie Sie) verwenden, müssen Sie nicht über Joins nachdenken - EF wird sie für Sie tun. Wenn Sie keine speziellen Kriterien angeben, wird one-to-many (z. B. Eltern -> Kinder) trotzdem mit der linken äußeren Verknüpfung verknüpft.

Also alles, was Sie brauchen, ist auf das gewünschte Ergebnis konzentrieren. Zum Beispiel, wenn Sie ein bestimmt Eltern zurückkehren mögen und es ist aktuelles Kinder, Sie so etwas wie diese verwenden:

var test = (from p in db.Parents 
      where p.ID == 1 
      select new 
      { 
       Parent = p, 
       CurrentChildren = p.Children.Where(c => c.isCurrect == 1) 
      }).FirstOrDefault(); 

Wenn Sie tatsächlich braucht nur ein einziges Strom Kind (falls vorhanden), dann so etwas wie diese :

var test = (from p in db.Parents 
      where p.ID == 1 
      select new 
      { 
       Parent = p, 
       CurrentChild = p.Children.FirstOrDefault(c => c.isCurrect == 1) 
      }).FirstOrDefault(); 
+0

wird also ein Objekt zurückgegeben, das aus einem Parent-Objekt und einem CurrentChild-Objekt besteht. Das Eltern-Objekt wird weiterhin die Eigenschaft von Kindern haben, die alle ihre Kinder enthalten, richtig? Ich möchte ein Objekt (ein Parent-Objekt) zu meiner Ansicht zurückgeben ... und ich möchte, dass Children entweder nur das aktuelle Kind enthält oder nichts, wenn kein aktuelles Kind vorhanden ist. (Angenommen, jeder Elternteil kann nur 1 aktuelles Kind haben.) – Andrew

+0

Dann können Sie die andere Lösung versuchen. Obwohl das Entity-Modell auf diese Weise wiederverwendet wird, ist es nicht gut. Die Entität sollte den Inhalt nicht filtern, weil - nun, es soll die Daten repräsentieren, die in der Datenbank sind. –