C# 将Func传递到将返回类型从IQueryable更改为IEnumerable的位置
我有以下代码C# 将Func传递到将返回类型从IQueryable更改为IEnumerable的位置,c#,linq,lambda,C#,Linq,Lambda,我有以下代码 IQueryable<MyClass> query = listOfObjects.Where(x => x.SomeProp == 1); 但是,将谓词传递到其中将返回类型更改为IEnumerable,这显然不是API所要求的类型 我(天真地)尝试了predicate.AsQueryable(),但所讨论的API(SharePoint客户端对象模型)只是失败了,出现了一个通用的“不支持指定的方法”。错误消息 我不知道这是否是LINQ提供程序在幕后的限制,但不管
IQueryable<MyClass> query = listOfObjects.Where(x => x.SomeProp == 1);
但是,将谓词
传递到其中
将返回类型更改为IEnumerable
,这显然不是API所要求的类型
我(天真地)尝试了predicate.AsQueryable()
,但所讨论的API(SharePoint客户端对象模型)只是失败了,出现了一个通用的“不支持指定的方法”。错误消息
我不知道这是否是LINQ提供程序在幕后的限制,但不管怎样。。。我很想理解为什么将
Func
拉出到它自己的变量中,并将其传递到中,
会以它的方式影响类型推断。IQueryable
使用表达式树来构建谓词。因此,与其
Func<MyClass, bool> predicate = x => GetPredicate();
Func predicate=x=>GetPredicate();
使用:
表达式谓词=x=>GetPredicate();
请记住:
使用IQueryable
时,会生成表达式树(表示对集合进行的操作(作为操作数和参数)的树)。为了将树转换为其他形式(比如sql查询,取决于LINQ proider),转换器必须知道树中使用的所有操作数。它看起来像是在服务中传递IQueryable
的转换器不知道GetPredicate
函数做什么(也不知道如何将其转换为sql查询),所以抛出不支持的异常。
Func而不是表达式也是如此。Func是谓词的兼容版本(存储为委托)-提供程序不知道如何转换委托。使用表达式时,谓词存储为树,因此提供程序可以“查看”表达式并正确翻译它。如果使用
IQueryable
则需要将谓词保留为表达式,因此不应将其编译为func。@Lee,感谢您的提示-这让我更进一步。SharePoint提供程序现在引发异常“表达式x不受支持”。出于某种原因,它似乎不喜欢我的谓词。哦,好吧,干杯!请参阅may post why-提供程序可能不知道什么是GetPredicate()
函数,因此无法翻译它。您好@pwas,很抱歉回复太慢。我的示例代码无意中具有误导性。我实际上并没有调用“GetPredicate”,而是在线构建谓词。我最终还是用PredicateBuilder从这里整理出了这一切@Chris McAtackney您能否提供导致异常的完整内联表达式?
Func<MyClass, bool> predicate = x => GetPredicate();
Expression<Func<MyClass, bool>> predicate = x => GetPredicate();