Filtrar la tabla "Incluye" en la consulta de Entity Framework
Esto es para Entity Framework para .NET 3.5:
Tengo la necesidad de consultar una tabla e incluir una colección de la tabla "muchos" de una relación uno a muchos. Estoy tratando de filtrar esa colección como parte de la consulta: soy bastante nuevo en Entity Framework y tengo problemas para resolverlo.
Ejemplo simplificado: el autor tiene libros y el libro tiene una columna IsFiction. Quiero una lista filtrada de autores, junto con todos los libros de ficción.
Sin el filtro, es fácil:
var q = from a in db.Authors.Include("Books")
where a.BirthYear > 1900
select a;
Puedo filtrar después del hecho, algo como:
var fictionBooks = a.Books.Where(b => b.IsFiction);
Pero el problema es que la consulta original ya se ejecutó e incluyó esos resultados, que es un procesamiento innecesario de la base de datos.
Puedo consultar por separado, 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;
}
Pero, por supuesto, esa es una llamada para cada autor, que también quiero evitar.
Puedo ir hacia atrás, como:
var allBooks = from b in db.Books.Include("Author")
where b.IsFiction
select b;
Pero luego vuelvo al problema original, excepto ahora en el lado del autor en lugar del lado del libro.
Debe haber una solución que lo abarque todo: puedo hacerlo en SQL con bastante facilidad:
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
¿Alguna sugerencia?