我正在摆弄 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/