2010-08-06 41 views
4

兼容(下面的代碼已被更新和工作正常)出現InvalidOperationException:沒有方法「去哪兒」上鍵入「System.Linq.Queryable」與提供的參數

有來自LinqPad動態排序依據樣本。我想要做的只是簡單地將'Where'而不是'OrderBy'應用於此示例。這裏是我的代碼:

IQueryable query =    
    from p in Purchases 
    //where p.Price > 100 
    select p; 

string propToWhere = "Price"; 

ParameterExpression purchaseParam = Expression.Parameter (typeof (Purchase), "p"); 
MemberExpression member = Expression.PropertyOrField (purchaseParam, propToWhere); 

Expression<Func<Purchase, bool>> lambda = p => p.Price < 100; 
lambda.ToString().Dump ("lambda.ToString"); 


//Type[] exprArgTypes = { query.ElementType, lambda.Body.Type }; 
Type[] exprArgTypes = { query.ElementType }; 

MethodCallExpression methodCall = 
    Expression.Call (typeof (Queryable), "Where", exprArgTypes, query.Expression, lambda); 

IQueryable q = query.Provider.CreateQuery (methodCall); 
q.Dump(); 
q.Expression.ToString().Dump("q.Expression"); 

這段代碼獲得異常: 「InvalidOperationException異常:沒有方法上鍵入'在哪裏‘System.Linq.Queryable’是與提供的參數兼容。」

任何幫助評估。

乾杯

回答

2
  1. 使用喬恩斯基特提供的拉姆達。他或許也可以解釋爲什麼​​是如此痛苦的使用和使用,而不是能夠通過名字:)

  2. 匹配修改此行相同情況下,需要:

Type[] exprArgTypes = { query.ElementType }; 

exprArgTypes是類型參數

IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate). 

正如你所看到的,它只有一個類型參數 - TSource,它是Purchase。你在做什麼,有效,打電話Where方法有兩個類型參數如下圖所示:

IQueryable<Purchase> Where<Purchase, bool>(this IQueryable<Purchase> source, Expression<Func<Purchase, bool>> predicate) 

一旦這兩個補丁都在表達沒問題運行。

4

您的lambda表達式創建對我來說看起來很奇怪。您沒有明顯的原因添加另一個參數。您還使用Predicate<Purchase>而不是Func<Purchase, bool>。試試這個:

LambdaExpression lambda = Expression.Lambda<Func<Purchase, bool>>(
        Expression.GreaterThan(member, Expression.Constant(100)), 
        purchaseParam); 
+0

嗨,喬恩,謝謝你的回覆。您提供的表達式抱怨 「二進制運算符GreaterThan未針對類型'System.Decimal'和'System.Int32'進行定義。」 – Zalan 2010-08-06 13:13:55

+0

啊。你沒有清楚表明'價格'是一個小數。我懷疑最簡單的解決辦法是將100米改爲100米。 – 2010-08-06 13:20:47

相關問題