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?