Filtre a tabela "Inclui" na consulta do Entity Framework

Isso é para o Entity Framework for .NET 3.5:

Tenho a necessidade de consultar uma tabela e incluir uma coleção da tabela "muitos" de um relacionamento um para muitos. Estou tentando filtrar essa coleção como parte da consulta - sou bastante novo no Entity Framework e estou tendo problemas para descobrir isso.

Exemplo simplificado: o autor possui livros e o livro possui uma coluna IsFiction. Quero uma lista filtrada de autores, juntamente com todos os livros de ficção.

Sem o filtro, é fácil:

var q = from a in db.Authors.Include("Books")
        where a.BirthYear > 1900
        select a;

Posso filtrar após o fato, algo como:

var fictionBooks = a.Books.Where(b => b.IsFiction);

Mas o problema é que a consulta original já foi executada e incluiu esses resultados, o que é um processamento desnecessário do banco de dados.

Eu posso consultar separadamente, como:

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;
}

Mas é claro que essa é uma convocação para todo autor, que eu também quero evitar.

Eu posso voltar para trás, como:

var allBooks = from b in db.Books.Include("Author")
               where b.IsFiction
               select b;

Mas volto ao problema original, exceto agora no lado do autor, em vez do lado do livro.

Deve haver uma solução que englobe tudo - eu posso fazê-lo no SQL facilmente:

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

Alguma sugestão?

questionAnswers(1)

yourAnswerToTheQuestion