LINQ - Abfrage wie Sortieren und filtern auf eager fetch
Wie mache ich ein begierig Abfrage von einer Eltern-Kind-Beziehung, die:
- - Filter ein, die auf untergeordneten Felder
- Sorten auf beide Eltern und Kind
- zurückgeben einer Liste, oder die Eltern mit den Kindern die pre-besiedelten
Wenn ich versuche
from p in _context.Parents.Include("children")
join c in _context.childrenon p.Id equals c.ParentId
where d.DeletedDate == null
orderby p.Name ascending, c.Name
select p
Bekomme ich dann das Parent-Objekt zurück, aber jedes Elternteil hat NULL für Kinder
wenn ich versuche
from p in _context.Parents.Include("children")
orderby p.Name ascending
select p
Die Abfrage gibt alle Eltern und Kinder, aber Sie sind nicht gefiltert oder sortiert werden.
Das Ergebnis will ich Sie zurück IEnumerable<Parent>
also
Parent[0].name = "foo"
Parent[0].children = IEnumerable<Child>
Parent[1].name = "bar"
Parent[1].children = IEnumerable<Child>
- Ich nehme an, jeder Elternteil kann null oder mehr Kinder. Was ist die erwartete Ausgabe, wenn ein Elternteil mehrere Kinder?
- Ich aktualisiert meine Frage mit dieser info
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung hängt davon ab, was genau Sie zu tun versuchen.
Die erste Abfrage gibt den Eindruck, dass Sie wollen "abflachen" das führt dazu, dass Objekte, wie diese (pseudocode, ich hoffe es ist klar was ich meine):
In diesem Fall ist jedes Ergebnis "Reihe" wäre ein Objekt, das eine
Parent
und einChild
Eigenschaft, und Sie könnte die Art von Eltern-name, und dann durch das Kind den Namen.Der zweiten Abfrage nur die Renditen der
Parent
Objekte und (Sie weiß es nicht, aber ich nehme an, EF-angewiesen worden, das zu tun), jeder hat eineChildren
Sammlung. In diesem Fall können Sie nur eine Art von Eltern-Namen, wenn Sie wollen, zu Sortieren jedesParent
's Kinder, Sortieren Sie dieChildren
Sammlung, die auf diesem Objekt von selbst.Welche der beiden willst du?
Update
OK, es scheint, Sie wollen die zweite. Ich glaube nicht, dass es getan werden kann, direkt. Können Sie tun es einfach, wenn Sie die Ergebnisse aufzulisten - da die
Parent
s bereits sortiert sind, einfach jede Art der eigenen Kinder:Include
wird nicht zulassen, die Sie, um das Kind Sammlungen, so dass Sie die ganze Sache über Projektionen). Beachten Sie, dass ich nicht verwendenInclude
an alle, und noch dieParents
in die entstehende Sammlung haben dieChildren
Sammlungen geladen. Sie können auch überprüfen, die EF-Abfragen, indem Sie Sie über den SQL Profiler.Gibt es keinen direkten Weg, dies zu tun, aber Sie können etwas von einem workaround - Projektes die Eltern und Kinder auf eine anonym Objekt und wählen Sie anschließend und Rückkehr der Eltern vom Objekt.
Siehe ähnliche Frage: Linq To Entities - wie filter auf untergeordnete Entitäten
In Ihrem Fall werden Sie etwas entlang der Linien von:
prefetching untergeordnete Felder: