Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Func传递到将返回类型从IQueryable更改为IEnumerable的位置_C#_Linq_Lambda - Fatal编程技术网

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();