在运行时构造表达式树

时间:2011-04-13 12:21:25

标签: linq

当此调用是NESTED时,是否可以构造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?

感谢

我的回答:
我设法解决了这个问题 Aducci给了我方向,thnk! 关键是使用ParameterExpression而不是实际的集合实例 从这里开始,骚动即将来临:编译Expression>,并将编译结果与实际集合一起调用。
这非常有帮助: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();

谢谢大家!

1 个答案:

答案 0 :(得分: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);