c# - LINQ - EF 的多个函数参数

标签 c# entity-framework linq lambda func

我正在摆弄 linq 的 Func 参数(在 Entity Framework 上)。然后我发现了这种行为

var idMatchQuery = new Func<MyClass, bool>(x => x.Id == someId);
var statusMatchQuery = new Func<MyClass, bool>(x => x.Status == someStatus);

/// works
var a = myClassEntity.FirstOrDefault(idMatchQuery);

/// doesn't work
var b = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && statusMatchQuery(p));

/// doesn't work
var c = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && p.Status == 1);

它会抛出 UnsupportedOperationException,因为 EF 无法识别这些查询。如果以上都不起作用的话,我可以更容易地接受它。但当它只适用于一个且仅一个 Func 查询,但不适用于与其他查询的组合时,它让我感到烦恼。

我确信对此有一个解释,但我想我的搜索词对于我正在寻找的答案来说太天真了。

此行为的解释是什么?

最佳答案

这是因为,EF 应该将您的谓词翻译为 TSQL 语言。你可以检查一下,FirstOrDefault那个参数方法不是Func<T, bool> ,而是Expression<Func<T, bool>> ,因为最后一个让我们有机会解析它并将其转换为 TSQL。当您使用两个Func<T, bool>时或Func<T, bool>由于Expression<Func<T, bool>>,使用简单的条件 EF 无法将其翻译并解析为 TSQL内部内容和功能复杂性,这就是为什么 EF 将此谓词保持在原始状态并按照最初编写的方式发送到服务器,结果 - UnsupportedOperationException 。因此,对于 EF - 解析第一个谓词比其他两个谓词更容易。

结论:这是由Expression<Func<T,bool>>中的翻译C#谓词的特征和方法引起的。到 TSQL,因为它有时足够高的复杂性。

关于c# - LINQ - EF 的多个函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38046495/

相关文章:

c# - 如何从文本文件 c# 中删除第一行和最后一行?

c# - HTML.RenderAction 来自不同位置?

c# - 使用 Linq 从表中计算星期一、星期二等的数量

c# - 如何使用 linq 将 'Y' 或 'N' 值转换为 bool 值?

c# - Xamarin Forms 如何制作全局工具栏?

c# - 如何找出我的错误来自哪里?

asp.net-mvc - 使用 Entity Framework 检测 Controller 中模型属性的状态变化

entity-framework - 用于 UI 开发的具有虚假数据源的应用程序

c# - 如何从 asp.net 核心服务访问 DbContext

C#/LINQ : Trying to optimize performance