我正在嘗試使模塊化Linq查詢(到OData源)。如何拆分任何子句中的Linq表達式
這是我的查詢的簡化版本:
// 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();
這一切編譯罰款,但是當我運行它,我的任何條款導致此異常:
無法投類型的對象「 System.Linq.Expressions.ConstantExpression'鍵入'System.Linq.Expressions.LambdaExpression'。
我知道這是我的任何子句,因爲如果我在語句中嵌入子句,它一切正常。
爲什麼我得到這個錯誤?我怎樣才能把這個陳述分解出來而不會出錯?
更新:使用表情
我試圖用這樣的表達:
Expression<Func<Encounter, bool>> orderAnyClause =
x => x.OrderName.StartsWith("Order 00");
而且我得到以下編譯時錯誤消息:
Instance argument: cannot convert from System.Data.Services.Client.DataServiceCollection<ODataComponetizedQueriesTest.MyEntities.Order>' to 'System.Linq.IQueryable<ODataComponetizedQueriesTest.MyEntities.Order>'
我試過了,它給編譯時錯誤。 (我用錯誤消息更新了我的問題。) – Vaccano 2013-03-26 20:25:54
Orders屬性是IEnumerable嗎?我假設它是。 Enumerable.Any擴展方法的簽名不會使用Expression>,因此您將無法使用它。相反,你需要使用Expression.Lamba,Expression.Call等來創建表達式,這些都是這些擴展方法。或者你也可以按照下面的建議製作訂單類型IQueryable 。 –
2013-03-26 21:03:36