小编Joe*_*ett的帖子

为什么EntityFramework的LINQ解析器以不同的方式处理外部定义的谓词?

我正在使用Microsoft的Entity Framework作为ORM,我想知道如何解决以下问题.我想ProductProducts集合中获得Product.StartDate比当今更大的对象.(这是整个问题的简化版本.)

我目前使用:

var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,在使用ToList()例如查询后,它可以正常工作,并且创建的SQL是有效的:

SELECT * FROM Product WHERE StartDate > (GetDate());
Run Code Online (Sandbox Code Playgroud)

但是,我想将谓词移动到一个函数以获得更好的可维护性,所以我尝试了这个:

private Func<Product, bool> GetFilter()
{
  Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
  return filter;
}
var query = dbContext.Products.Where(GetFilter());
Run Code Online (Sandbox Code Playgroud)

这也是从代码的角度来看,只要它返回相同的Product集合,但这次创建的SQL类似于:

SELECT * FROM Product;
Run Code Online (Sandbox Code Playgroud)

筛选器从SQL Server移动到客户端,使其效率降低.

所以我的问题是:

  • 为什么会发生这种情况,为什么LINQ解析器会以不同的方式处理这两种格式?
  • 我可以做些什么来利用过滤器分离但在服务器上执行它?

.net c# linq entity-framework sql-generation

9
推荐指数
2
解决办法
344
查看次数

什么是LinqPad的lambda窗口?

我可能是愚蠢的,但在运行代码后似乎永远不会在'lambda窗口'中显示任何内容.任何人都可以解释它应该如何工作?

linq linqpad

7
推荐指数
1
解决办法
4832
查看次数

标签 统计

linq ×2

.net ×1

c# ×1

entity-framework ×1

linqpad ×1

sql-generation ×1