【发布时间】: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