Entity Framework: Untergeordnete Entitäten abfragen
Lerne ich über Entity Framework auf der mo, und habe Probleme!!
Kann jemand klären, ob ich zu Recht denken, dass ich kann nicht ein Elternteil und ein Teil der Kinder aus der db?
Zum Beispiel...
db.Parents
.Include(p => p.Children)
.Where(p => p.Children.Any(c => c.Age >= 5))
Dieser wird wieder alle Eltern, die ein Kind im Alter 5+, aber wenn ich das Durchlaufen der Eltern.Kinder-Sammlung, alle Kinder anwesend sein werden (nicht nur die über 5 Jahre alt).
Nun die Abfrage macht Sinn für mich (ich habe gefragt, um Kinder und ich habe Sie!), aber kann mir vorstellen, dass ich möchte, um die where-Klausel angewandt, um die untergeordnete Sammlung in einigen Szenarien.
Fragen:
- Ist das, was ich gesagt habe, richtig?
- Ist es möglich, den Eltern und nur bei einem Teil der von der db ohne make Lasten der Aufrufe der db?
- Bin ich Weg von der Marke? (Wäre nicht das 1. mal)!!!!
Ich habe ein paar blogs und SO posts, die berühren, auf dem Thema, aber nichts, das erklärt es gut genug für mein kleines Gehirn.
BEARBEITEN
Lesen dieses blog (vielen Dank Daz Lewis).......Ich noch nicht bekommen!!!
In das Beispiel in dem blog, ich kann sehen, wie ich es erreichen kann, gegen eine einzelne Instanz von Parent, aber ich bin kämpfen, um herauszufinden, wie ich es machen kann, mit einer Sammlung.
Wie bekomme ich ein IEnumerable, in dem jeder von den Eltern hat Sie eine gefilterte Auflistung von Kinder (Alter>=5)?
Weiteren Klärung:
In Antwort auf DonAndre Kommentar, ich bin nach a) eine Liste von Eltern, die ein Kind älter als 5 ist (und nur die Kinder).
Jede Hilfe dankbar,
Dank.
InformationsquelleAutor der Frage ETFairfax | 2011-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so erhalten Sie eine Auflistung von Eltern mit einem gefilterten Kinder-Kollektion in einer einzigen Datenbank-Rundreise ist mit einer Projektion. Es ist nicht möglich, eager loading (
Include
), weil es nicht unterstützt Filterung,Include
immer lädt die gesamte Kollektion. Die ausdrückliche be-Weg, dargestellt durch @Daz erfordert einen roundtrip pro übergeordnete Entität.Beispiel:
Können Sie direkt die Arbeit mit dieser Sammlung von anonymous-Art-Objekte. (Sie können auch ein Projekt in Ihrem eigenen Namen geben Sie anstelle eines anonymen Projektion (aber nicht in eine Entität wie
Parent
).)EF Kontext wird auch Auffüllen der
Children
Sammlung derParent
automatisch, wenn Sie nicht deaktivieren Sie die änderungsnachverfolgung (mitAsNoTracking()
zum Beispiel). In diesem Fall können Sie dann Projekt der Eltern-aus dem anonymen Ergebnis geben (passiert in Speicher, keine DB-Abfrage):parents[i].Children
enthalten die gefilterten Kinder für jedeParent
.Bearbeiten zu deinem letzten Edit in der Frage:
Den code oben zurückkehren würde alle Eltern nur mit den Kindern mit
Age
>= 5, also potenziell auch Eltern mit einem leeren Kinder-Kollektion, wenn es nur Kinder mitAge
< 5. Sie können diese filter mit einer zusätzlichenWhere
- Klausel für die Eltern bekommen nur die Eltern, die mindestens eine (Any
) Kind mitAge
>= 5:InformationsquelleAutor der Antwort Slauma
Nehmen Ihr Beispiel sollte Folgendes tun, was Sie brauchen. Werfen Sie einen Blick hier für mehr info.
InformationsquelleAutor der Antwort Darren Lewis
Ich denke, dass Eltern und Kind sind nicht wirklich gut geeignet als separate Einheiten. Ein Kind kann immer auch ein Elternteil, in der Regel ein Kind hat zwei Eltern (Vater und Mutter), so dass es nicht die einfachste Kontext. Aber ich nehme an, Sie müssen nur eine einfache 1:n-Beziehung wie in der folgenden master-slave-Modell, das ich verwendet.
Was Sie tun müssen, ist, eine left outer join (diese Antwort hat mich auf den richtigen Weg). Eine solche Verknüpfung ist ein bisschen schwierig zu tun, aber hier ist der code
Wird dies übersetzen in der folgenden SQL-Anweisung mit EF 4.1
Beachten Sie, dass es ist wichtig, um die zusätzlichen where-Klausel auf das Alter für die verbundenen Sammlung und nicht zwischen den von-und den wählen.
EDIT:
WENN Sie möchten, eine hierarchische Ergebnis können Sie konvertieren Sie die Liste, indem Sie eine Gruppierung:
Beachten Sie, dass ich eine anonyme Art zu speichern, die hierarchisch Ergebnis. Natürlich können Sie auch schaffen eine bestimmte Art, wie diese
und dann Projekt der Gruppe in Instanzen dieser Klasse. Das macht es einfacher, wenn Sie müssen übergeben Sie diese Ergebnisse mit anderen Methoden.
InformationsquelleAutor der Antwort Andreas