2013-05-07 53 views
0

我有一系列對象都具有類似的屬性,它們是屬於它們的組的Id(每個孩子很多父母)的列表。動態數據 - 爲列表實現IQueryable <int>包含()

我無法通過編程實現必要的Linq表達式來使此過濾器正常工作。

這是我到目前爲止有:

無方法「包含」存在於型「System.Collections中:

IQueryable result = null; 

    if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue)) 
    { 
     ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue)); 
     ParameterExpression pe = Expression.Parameter(source.ElementType); 
     MemberExpression me = Expression.Property(pe, this.Column.Name); 
     MethodCallExpression mce = Expression.Call(typeof(List<int>), "Contains", new[] { typeof(int) }, me, ce); 

     result = source.Provider.CreateQuery(mce); 
    } 

return result; 

試圖創建我MethodCallExpression當我得到一個異常.Generic.List`1 [System.Int32]」。

任何指針從哪裏開始?

+0

我很困惑,你幾乎就在有這個[您的上一個問題](http://stackoverflow.com/q/16347794/41071)。 – svick 2013-05-07 15:44:24

+0

在這個問題中,該方法是靜態的。 – 2013-05-07 15:51:32

+0

當我嘗試創建查詢時,其他問題導致異常:「參數表達式不執行System.Linq.IQueryable'1 [System.Boolean]。」 – 2013-05-07 15:51:35

回答

0

方法簽名的Type你使用:

public static MethodCallExpression Call(Type type, 
             string methodName, 
             Type[] typeArguments, 
             params Expression[] arguments); 

指定包含特定靜態方法的類型。

您需要的類型實例,該方法可用 - 一個例子(涉及您的評論):

var par = Expression.Parameter(typeof(int), "par");    
var inst = Expression.Parameter(typeof(List<int>), "inst"); 
var body = Expression.Call(inst, typeof(List<int>).GetMethod("Contains"), par); 
var exp = Expression.Lambda(body, inst, par); 
var deleg = exp.Compile(); 

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
var exists = deleg.DynamicInvoke(lst, 3); 
+0

謝謝。有沒有類似的東西可以用來達到預期的效果?我基本上試圖寫一個表達式,看看選定的Id是否出現在Ids的這個對象的列表中。 – 2013-05-07 15:46:01

0

你的方法調用不正確,調用非靜態方法你需要提供包含該方法的實例。這裏的例子Contains方法調用:

var list = new List<int> {1}; 
//Target for invoke method 
var target = Expression.Constant(list); 
var methodCallExpression = Expression.Call(target, typeof(List<int>).GetMethod("Contains"), Expression.Constant(1)); 

如果在你的代碼me這是一個包含List代碼會是這樣的一個成員:

Expression.Call(me, typeof(List<int>).GetMethod("Contains"), ce); 
+0

越來越近...現在,MethodCallExpression部分似乎正常工作,但是當我嘗試使用IQueryable源創建查詢時,我得到以下異常:「參數表達式不實現System.Linq.IQueryable'1 [系統.Boolean]「。 – 2013-05-07 15:59:04

+0

什麼類型的'source'變量? – 2013-05-07 16:05:01

+0

source是傳入GetQueryable方法的IQueryable,它從QueryableFilterUserControl的繼承中重寫。 – 2013-05-07 17:37:29