我正在使用 Microsoft 的实体框架作为 ORM,并且想知道如何解决以下问题。我想Product
从Products
集合中获取一些Product.StartDate
大于今天的对象。(这是整个问题的简化版本。)
我目前使用:
var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
执行此操作时ToList()
,例如在查询上使用后,它可以工作并且创建的 SQL 有效:
SELECT * FROM Product WHERE StartDate > (GetDate());
但是,我想将谓词移动到一个函数以获得更好的可维护性,所以我尝试了这个:
private Func<Product, bool> GetFilter()
{
Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
return filter;
}
var query = dbContext.Products.Where(GetFilter());
从代码的角度来看,这也适用,因为它返回相同的Product
集合,但这次创建的 SQL 类似于:
SELECT * FROM Product;
过滤器从 SQL Server 移到客户端,使其效率大大降低。
所以我的问题是:
- 为什么会发生这种情况,为什么 LINQ 解析器对这两种格式的处理方式如此不同?
- 我可以做些什么来利用过滤器分开但在服务器上执行它?