Filtern Sie die Tabelle "Includes" in der Entity Framework-Abfrage
Dies ist für Entity Framework für .NET 3.5:
Ich muss eine Tabelle abfragen und eine Auflistung der "many" -Tabelle einer Eins-zu-viele-Beziehung einfügen. Ich versuche, diese Auflistung als Teil der Abfrage zu filtern. Entity Framework ist noch ziemlich neu und ich habe Probleme, sie herauszufinden.
Vereinfachtes Beispiel: Der Autor hat Bücher und das Buch hat eine IsFiction-Spalte. Ich möchte eine gefilterte Liste von Autoren, zusammen mit allen Belletristikbüchern.
Ohne den Filter ist es einfach:
var q = from a in db.Authors.Include("Books")
where a.BirthYear > 1900
select a;
Ich kann nach der Tatsache filtern, so etwas wie:
var fictionBooks = a.Books.Where(b => b.IsFiction);
Aber das Problem ist, dass die ursprüngliche Abfrage bereits ausgeführt wurde und diese Ergebnisse enthielt, was eine unnötige Datenbankverarbeitung darstellt.
Ich kann separat abfragen, wie:
var q = from a in db.Authors where a.BirthYear > 1900 select a;
foreach (var a in q)
{
var books = from b in db.Books
where ((b.Author.Id == a.Id) && (b.IsFiction))
select b;
}
Aber das ist natürlich ein Aufruf für jeden Autor, den ich auch vermeiden möchte.
Ich kann rückwärts gehen, wie:
var allBooks = from b in db.Books.Include("Author")
where b.IsFiction
select b;
Aber dann bin ich wieder beim ursprünglichen Problem, außer jetzt auf der Autorenseite anstelle der Buchseite.
Es muss eine Lösung geben, die alles umfasst - das kann ich in SQL ganz einfach:
select * from author a
left join book b on a.id = b.author_id and b.is_fiction = 1
where a.birth_yea,r > 1900
Irgendwelche Vorschläge