LINQ - EF 的多个函数参数

Multiple func parameters for LINQ - EF

我正在摆弄 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 不识别那些查询。如果上面的 none 不起作用,我可以更容易地接受它。但是当它只处理一个 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 - 解析第一个谓词比其他两个更容易。

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