【问题标题】:How to build an IEnumerable<int>.Contains() Expression?如何构建 IEnumerable<int>.Contains() 表达式?
【发布时间】:2013-04-27 04:49:17
【问题描述】:

我目前是第一次使用 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”类型上没有通用方法“包含” 与提供的类型参数和参数兼容。无类型 如果方法是非泛型的,则应提供参数。

【问题讨论】:

  • 我可能已经完全错误地阅读了这个问题,但是您不能使用 LINQ 查询更简单地实现同样的目的吗? rapidprogramming.com/tutorial/…
  • @bUKaneer,SQL 可翻译的 LINQ 查询必须使用表达式树。有时您可以让编译器为您完成这项工作。其他时候(当您只知道运行时的符号时,如 OP 的示例:this.Column.Name),您必须以困难的方式构建表达式树(如上)。
  • @SonnyBoy,你说“继续抛出异常”,但你没有告诉我们抛出了哪些异常。
  • 抱歉!这是一个例外:“类型 'System.Linq.Enumerable' 上没有泛型方法 'Contains' 与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。”
  • @Sonny,我想你可能忘记将可枚举本身作为第一个参数传递给.Contains

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


【解决方案1】:

你的代码有两个问题:

  1. 您的参数是反向的。第一个参数必须是集合,第二个参数是您要搜索的项目。
  2. 你的类型参数是IEnumerable&lt;int&gt;,而它应该只是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));

【讨论】:

  • 谢谢。没有更多的例外,尽管我还没有验证我的方法是否有效。然而,这种表达方式在未来将是动态的,因为我们将采用这种方法来适应多种父/子关系。
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多