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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage