EF-Abfrage mit bedingtem Include

entity-framework

Frage

Ich habe zwei Tabellen: eine WorkItem-Tabelle und eine WorkItemNote-Tabelle. Wie kann ich ein WorkItem und alle WorkItemNotes zurückgeben, die bestimmte Kriterien erfüllen?

Ich denke, das sollte einfach sein, fast wie ein bedingtes "Include", oder?

Akzeptierte Antwort

Ich hatte vor, einen Tipp dazu zu schreiben, aber Ihre Frage hat mich bis zum Anschlag getroffen.

Angenommen, ein WorkItem enthält viele WorkItemNotes

du kannst das:

var intermediary = (from item in ctx.WorkItems
              from note in item.Notes
              where note.SomeProp == SomeValue
              select new {item, note}).AsEnumerable();

Dadurch wird für jedes WorkItemNote ein anonymes Element WorkItemNote , das übereinstimmt und das entsprechende WorkItem .

Die Identitätsauflösung von EF stellt sicher, dass dasselbe WorkItem (durch Referenz) mehrmals zurückgegeben wird, wenn mehrere WorkItemNotes , die den Kriterien entsprechen.

Ich WorkItems davon aus, dass Sie als Nächstes einfach nur zu den WorkItems , wie WorkItems :

var workItems = intermediary.Select(x => x.item).Distinct().ToList();

Dann, wenn Sie das jetzt tun:

foreach(var workItem in workItems)
{
   Console.WriteLine(workItem.Notes.Count)
}

Sie werden sehen, dass WorkItemNotes , die dem ursprünglichen Filter entsprechen, der Notes-Auflistung jedes workItem .

Dies ist auf etwas zurückzuführen, das als Relationship Fixup bezeichnet wird.

Dh das gibt Ihnen das, was Sie bedingt aufnehmen wollen.

Hoffe das hilft

Alex



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum