2013-03-26 55 views
0

我正在嘗試使模塊化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>' 

回答

5

您可以嘗試定義訂單AnyClause這樣的:

Expression<Func<Encounter, bool>> orderAnyClause = 
             x => x.OrderName.StartsWith("Order 00"); 

我沒有測試它,但方式查詢綜合工程(基於錯誤),這將不能夠除非得到它作爲一個表達式用它做任何事。

+0

我試過了,它給編譯時錯誤。 (我用錯誤消息更新了我的問題。) – Vaccano 2013-03-26 20:25:54

+0

Orders屬性是IEnumerable嗎?我假設它是。 Enumerable.Any擴展方法的簽名不會使用Expression >,因此您將無法使用它。相反,你需要使用Expression.Lamba,Expression.Call等來創建表達式,這些都是這些擴展方法。或者你也可以按照下面的建議製作訂單類型IQueryable 。 – 2013-03-26 21:03:36

0

您的IQueryable需要與expression trees一起使用才能轉換查詢 - 換句話說,它需要將代碼視爲數據,而不僅僅是可執行代碼。

現在,我不是100%肯定這會工作,但我希望,你可以使用:

Expression<Func<Encounter, bool>> orderAnyClause = 
    x => x.OrderName.StartsWith("Order 00"); 

...然後保持相同的代碼。這樣,您的orderByClause變量引用表達式樹,而不是委託。現在,它可能是這是行不通的 - 因爲你在這裏的另一個lambda表達式使用它:

cust => cust.Orders.Any(orderAnyClause) 

...這lambda表達式將轉換爲表達式樹。這真的取決於OData提供商用它做什麼。你可能需要寫一個方法來做時髦的東西來建立cust.Orders.Any(orderAnyClause) - 但它是值得嘗試的第一個簡單的方法。

+0

我試過了,但我得到一個編譯錯誤。 (請參閱我更新的錯誤的錯誤)。 – Vaccano 2013-03-26 20:28:49

+0

@Vaccano:你在那條線上或以後得到那個錯誤*這似乎是一個奇怪的線上得到錯誤... – 2013-03-26 20:34:25

+0

它是在線,我嘗試使用orderAnyClause(在我的例子中的第二行代碼) – Vaccano 2013-03-26 20:53:30