Estoy usando Entity Framework de Microsoft como ORM y me pregunto cómo resolver el siguiente problema. Quiero obtener un número de objetos Product
de la colección Products
donde el Product.StartDate
es mayor que el día de hoy. (Esta es una versión simplificada de todo el problema.)¿Por qué el analizador LINQ de EntityFramework maneja un predicado definido externamente de manera diferente?
Actualmente uso:
var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
Cuando se ejecuta esto, después de usar ToList()
por ejemplo, en consulta, funciona y el SQL creada es efectiva:
SELECT * FROM Product WHERE StartDate > (GetDate());
Sin embargo, quiero mover el predicado de una función para una mejor capacidad de mantenimiento, por lo que he intentado esto:
private Func<Product, bool> GetFilter()
{
Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
return filter;
}
var query = dbContext.Products.Where(GetFilter());
Esto también funciona desde un punto de vista en la medida en código, ya que devuelve el mismo Product
set, pero esta vez el SQL creado es análogo a:
SELECT * FROM Product;
El filtro se mueve desde el SQL Server para el cliente por lo que es mucho menos eficiente.
Así que mis preguntas son:
- por qué sucede esto, ¿por qué tratar el analizador LINQ estos dos formatos de manera tan diferente?
- ¿Qué puedo hacer para aprovechar el filtro por separado pero que se ejecute en el servidor?
+1 Just beat me to it. –
@Dommer jaja! ¡Normalmente no soy un buen "sorteo rápido"! –
Gracias, eso funcionó. –