2

我目前是第一次使用 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' 与提供的类型参数和参数不兼容。如果方法是非泛型的,则不应提供类型参数。

4

1 回答 1

2

您的代码中有两个问题:

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

所以,固定代码是:

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));
于 2013-05-03T13:13:13.253 回答