如何在Any子句中拆分Linq表达式

Vac*_*ano 0 .net c# linq wcf-data-services odata

我正在尝试进行模块化Linq查询(到OData源).

这是我的查询的简化版本:

// Any clause that I want to be modular
Func<Encounter, bool> orderAnyClause = x => x.OrderName.StartsWith("Order 00");

// Query using the any clause
var result = entities.Customers.Where(cust=> cust.Orders.Any(orderAnyClause));

// A method to do the selection.  It works just fine.
IQueryable<SearchSelectionResult> selectedResults = SelectResults(result); 

// This throws the exception shown below
var list = selectedResults.ToList();  
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是当我运行它时,我的any子句会导致这个异常:

无法将类型为"System.Linq.Expressions.ConstantExpression"的对象强制转换为"System.Linq.Expressions.LambdaExpression".

我知道这是我的任何条款,因为如果我在声明中嵌入该条款,一切正常.

为什么我收到此错误?我怎么能打破这个声明而不是错误呢?


更新:使用表达式

我尝试使用这样的表达式:

Expression<Func<Encounter, bool>> orderAnyClause = 
                                      x => x.OrderName.StartsWith("Order 00");
Run Code Online (Sandbox Code Playgroud)

我收到以下编译时错误消息:

Instance argument: cannot convert from System.Data.Services.Client.DataServiceCollection<ODataComponetizedQueriesTest.MyEntities.Order>' to 'System.Linq.IQueryable<ODataComponetizedQueriesTest.MyEntities.Order>'
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以尝试定义orderAnyClause,如下所示:

Expression<Func<Encounter, bool>> orderAnyClause = 
                                        x => x.OrderName.StartsWith("Order 00");
Run Code Online (Sandbox Code Playgroud)

我没有测试它,但是查询理解的工作方式(并且基于错误),它将无法对它做任何事情,除非它将它作为一个表达式.