如何构建IEnumerable .Contains()表达式?

我目前正在使用ASP动态数据,我正在尝试构建一个filter。 我们的用户需要根据项目是否是所选父项的子项来查找列表中的项目(我们的项目可以包含多个父项)。

有问题的项目是Segments,每个Segment都有一个名为RouteIds的属性,类型为IEnumerable,它是所有Segment的父ID的集合。

我已经在我的filter中覆盖了GetQueryable方法,但是我一直在显示的最后一行抛出exception:

ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue)); ParameterExpression pe = Expression.Parameter(source.ElementType); MemberExpression me = Expression.Property(pe, this.Column.Name); var callExpression = Expression.Call(typeof(Enumerable), "Contains", new Type[] { me.Type }, ce, me); 

想法是用户从DropDownList中选择适当的Route然后我会检查Segment的RouteIds属性是否包含该Route的Id。

有关如何使其工作的任何指示?

编辑 – 以下是例外情况:

类型’System.Linq.Enumerable’上没有generics方法’Contains’与提供的类型参数和参数兼容。 如果方法是非generics的,则不应提供类型参数。

您的代码中存在两个问题:

  1. 你的参数是倒退的。 第一个参数必须是集合,第二个参数是您要搜索的项目。
  2. 你的类型参数是IEnumerable ,它应该只是int

所以,固定代码是:

 var callExpression = Expression.Call( typeof(Enumerable), "Contains", new[] { typeof(int) }, me, ce); 

但是你的表达的所有部分似乎都不是动态的,所以也许下面的内容也会起作用:

 Expression> expression = s => s.RouteIds.Contains(int.Parse(this.ddlRouteNames.SelectedValue));