C# 动态数据-为列表实现IQueryable<;int>;包含()

C# 动态数据-为列表实现IQueryable<;int>;包含(),c#,asp.net,dynamic-data,linq-expressions,C#,Asp.net,Dynamic Data,Linq Expressions,我有一系列对象,它们都有一个类似的属性,即它们所属组的ID列表(每个孩子有许多父对象) 我在编程实现Linq表达式时遇到了问题,这是使该过滤器正常工作所必需的 这就是我到目前为止所做的: IQueryable result = null; if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue)) { ConstantExpression ce = Expression.Constant(int.P

我有一系列对象,它们都有一个类似的属性,即它们所属组的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;
IQueryable结果=null;
如果(!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),“Contains”,new[]{typeof(int)},me,ce);
结果=source.Provider.CreateQuery(mce);
}
返回结果;
尝试创建MethodCallExpression时出现异常:

类型“System.Collections.Generic.List`1[System.Int32]”上不存在“Contains”方法


关于从何处开始的任何指针?

在您使用的方法签名中键入

public static MethodCallExpression Call(Type type, 
                                        string methodName, 
                                        Type[] typeArguments, 
                                        params Expression[] arguments);
指定包含特定静态方法的类型

您需要此方法的类型实例可用-示例(与您的注释相关):

<代码> var PAR =表达式。参数(Type of(int),PAR); var inst=表达式参数(typeof(List),“inst”); var body=Expression.Call(inst,typeof(List).GetMethod(“Contains”),par); var exp=表达式λ(阀体、仪表、零件); var deleg=exp.Compile(); var lst=newlist(){1,2,3,4,5}; var exists=deleg.DynamicInvoke(lst,3);
您的方法调用不正确,要调用非静态方法,您需要提供包含该方法的实例。下面是
包含
方法调用的示例:

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));

我很困惑,您的回答几乎正确。在这个问题中,方法是静态的。当我尝试创建查询时,其他问题会导致异常:“参数表达式不实现System.Linq.IQueryable`1[System.Boolean]”。谢谢。我是否可以使用类似的方法来达到预期的效果?基本上,我正在尝试编写一个表达式,以查看所选Id是否出现在该对象的Id列表中。越来越近。。。MethodCallExpression部分现在似乎工作正常,但当我尝试使用IQueryable源代码创建查询时,出现了以下异常:“参数表达式未实现System.Linq.IQueryable`1[System.Boolean]”。“什么类型的
source
变量?source是传递到GetQueryable方法中的IQueryable,从QueryableFilterUserControl的继承中重写。
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));
Expression.Call(me, typeof(List<int>).GetMethod("Contains"), ce);