我有一个用于查询数据库的 EF Code First Db 上下文。当从我的聚合存储库中以 s 的形式传递查询时,我注意到一些性能问题,Func<Product, bool>
并且在进一步调查时发现查询没有被转换为 SQL 查询。
经过一番挖掘,我发现了以下内容。
var results = _context.Products
.Where(p => p.ProductCode.Contains("AAA"))
.Where(p => p.CategoryId == 1)
.ToList();
这完全符合预期。它生成一些带有 Where 子句的参数化 SQL。
==================================================== =================
var results2 = _context.Products
.Where(p => p.ProductCode.Contains("AAA") && p.CategoryId == 1)
.ToList();
这也按预期工作。它生成与上面相同的sql
==================================================== =================
Func<Product, bool> pred = (p => p.ProductCode.Contains("AAA") && p.CategoryId == 1);
var results3 = _context.Products.Where(pred).ToList();
这是坏了。它不会在 SQL 中生成 where 子句,而是返回所有内容,然后在代码中对其进行过滤。