如何构建IEnumerable <int> .Contains()表达式?</int>

时间:2013-05-02 21:10:57

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

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

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

我已经在我的过滤器中覆盖了GetQueryable方法,但是我一直在显示的最后一行抛出异常:

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'上没有泛型方法'Contains'是   与提供的类型参数和参数兼容。没有类型   如果方法是非泛型的,则应提供参数。

1 个答案:

答案 0 :(得分:2)

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

  1. 您的参数是倒退的。第一个参数必须是集合,第二个参数是您要搜索的项目。
  2. 您的类型参数为IEnumerable<int>,应该只是int
  3. 所以,固定代码是:

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

    但是你的表达的所有部分似乎都不是动态的,所以也许这样的事情也会起作用:

    Expression<Func<Segment, bool>> expression =
        s => s.RouteIds.Contains(int.Parse(this.ddlRouteNames.SelectedValue));