【问题标题】:construct expression tree in run time在运行时构建表达式树
【发布时间】:2011-04-14 16:44:56
【问题描述】:

当这个调用被嵌套时,是否可以构造 MethodCallExpression(通过使用 Expression.Call)?那么,在设计时,调用应该针对的实际序列(IQueryable 或 IEnumerable)是未知的?

示例:
假设这是查询:
var result = data.GroupBy(x => x.Name).Select(grouping => grouping.OrderByDescending(x => x.Date).Take(1).FirstOrDefault()).ToList();

当数据是对象列表时包含:名称、日期属性。
我如何构造这个查询块: grouping => grouping.OrderByDescending(x => x.Date) 使用 Expression.call?

谢谢

我的回答:
我设法解决了这个问题。
阿杜奇给了我方向,谢谢! 关键是使用 ParameterExpression 而不是实际的集合实例。
从这里开始,解决方案指日可待:编译表达式>,并使用实际集合调用编译结果。
这很有帮助:MethodCallExpression -> compiled expression
还有:link

我正在添加我的最终代码:

        Expression<Func<Data,DateTime>> lmbd = x => x.Date;
        ParameterExpression par = Expression.Parameter(typeof(IQueryable<Data>),"pname");

        ParameterExpression[] parameters = new ParameterExpression[] {par};
        MethodCallExpression method = Expression.Call(typeof(Queryable),"OrderBy",new Type[]{typeof(Data),typeof(DateTime)},par, lmbd);

        var lambaExpression = Expression.Lambda<Func<IQueryable<Data>, IQueryable<Data>>>(method, par);
        var compiled = lambaExpression.Compile();

谢谢大家!

【问题讨论】:

  • 有人能解释一下为什么不能使用 CreateQuery 来构建这个表达式树吗?当我尝试使用“lambaExpression”调用 CreateQuery 时,它会抛出“参数表达式无效”。

标签: linq


【解决方案1】:

我问了一个类似的问题,可以找到here

ParameterExpression innerParameter = Expression.Parameter(typeof(GROUPING), "x");
Expression innerExpression = Expression.Lambda<Func<DATA, object>>(Expression.Property(innerParameter, "Date"),
                                      innerParameter); 

ParameterExpression parameter = Expression.Parameter(typeof(DATA), "grouping");

Expression call = Expression.Call(typeof(Enumerable), 
                                  "OrderByDescending", 
                                  new type[] { typeof(DATA) },
                                  parameter,
                                  innerExpression); 

【讨论】:

  • 感谢您的回复。我不认为它会起作用(还没有尝试过),因为“OrderByDescending”接受 2 个泛型类型,所以 Type[] 应该包含 2 个类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多