动态数据 - 为List <int>实现IQueryable包含()</int>

时间:2013-05-07 15:05:34

标签: c# asp.net dynamic-data linq-expressions

我有一系列对象都具有类似的属性,它们是所属组的ID的列表(每个孩子有很多父母)。

我无法以编程方式实现必要的Linq表达式,以使此过滤器正常工作。

这是我到目前为止所做的:

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时遇到异常:

  

类型'System.Collections.Generic.List`1 [System.Int32]'上没有方法'Contains'。

关于从哪里开始的任何指示?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);