当此调用是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();
谢谢大家!
答案 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);