gpt4 book ai didi

c# - 将 Func 传递给 Where 将返回类型从 IQueryable 更改为 IEnumerable

转载 作者:行者123 更新时间:2023-11-30 14:10:20 27 4
gpt4 key购买 nike

我有以下代码;

IQueryable<MyClass> query = listOfObjects.Where(x => x.SomeProp == 1);

我将其传递给特定 API 上的方法,该 API 需要 IQueryable,这很好。

但是,我想动态构建谓词,所以我使用 Expression.Lambda为了实现这一点,然后我 .Compile它把它变回 Func<MyObject, bool> .

我原以为以下方法会奏效;

Func<MyClass, bool> predicate = x => GetPredicate();
IQueryable<MyClass> query = list.Fields.Where(predicate);

但是,通过 predicateWhere已将返回类型更改为 IEnumerable<MyClass> ,这显然不是 API 所需的类型。

我确实(天真地)尝试了 predicate.AsQueryable() ,但有问题的 API(SharePoint 客户端对象模型)只是失败并显示一条通用的“不支持指定的方法。” 错误消息。

我不知道这是否是幕后 LINQ 提供程序的限制,但无论如何......我很想知道为什么拉出 Func out 进入它自己的变量并将其传递给 Where以它的方式影响类型推断。

最佳答案

IQueryable 使用表达式树来构建谓词。所以,而不是

Func<MyClass, bool> predicate = x => GetPredicate();

使用:

Expression<Func<MyClass, bool>> predicate = x => GetPredicate();

请记住:在使用 IQueryable 时,构建了表达式树(表示对集合进行的操作(作为操作数和参数)的树)。为了将树翻译成其他形式(假设是 sql 查询,取决于 LINQ proider),翻译器必须知道树中使用的所有操作数。看起来你正在传递 IQueryable 的服务中的翻译器不知道 GetPredicate 函数做了什么(并且不知道如何将它翻译成 sql 查询)所以抛出 不支持的异常。

用 Func 而不是 Expression 也是一样。 Func 是谓词的编译版本(存储为委托(delegate))——提供者不知道如何翻译委托(delegate)。使用表达式时,谓词存储为树,因此提供者可以“查看”表达式并正确翻译它。

关于c# - 将 Func 传递给 Where 将返回类型从 IQueryable 更改为 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24652251/

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