gpt4 book ai didi

sql - 为什么单独实例化的 Func 谓词不使用 Entity Framework 转换为 SQL?

转载 作者:行者123 更新时间:2023-12-02 08:52:03 25 4
gpt4 key购买 nike

我有一个用于查询数据库的 EF Code First Db 上下文。当以 Func<Product, bool> 形式传递查询时,我注意到一些性能问题来 self 的聚合存储库的 s 并在进一步调查后发现查询未被转换为 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 子句,它会返回所有内容,然后在代码中对其进行过滤。

最佳答案

因为为了翻译成 SQL,它必须是 Expression<...> , 不是 Func<...> .

这是由编译器自动为您完成的,并且由于 Linq-to-SQL 类的重载采用表达式而不是委托(delegate),编译器会自动将您的代码(看起来像 lambda 或匿名方法)转换为一个表达式对象并传递它。

但是,如果您自己构建函数,编译器将无法执行此操作,并且 Linq-to-SQL 不采用匿名方法,它只采用表达式。

您可以执行您可以执行的查询部分,然后通过您的函数过滤结果,但我会考虑将您的值的类型改为表达式。

关于sql - 为什么单独实例化的 Func<T,bool> 谓词不使用 Entity Framework 转换为 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7783637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com