我正在尝试为此linq查询构建一个表达式树:这样就可以传入通用实体:
this.EntityCollection.Select((ent) => ent.TimeStamp).Max()
我想创建一个使用通用实体并找到其TimeStamp属性最大值的类。
我正在尝试以下类似的方法,但是它抱怨:
ParameterExpression param = Expression.Parameter(typeof(TE), "ent");
MemberExpression prop = Expression.
Property(param, typeof(TE).GetProperty("TimeStamp").GetGetMethod());
Expression<Func<TE, DateTime>> lambda = Expression.Lambda<Func<TE, DateTime>>(
prop, new ParameterExpression[] { param });
DateTime maxdate = this.EntityCollection.Select(lambda).Max();
编译时,在代码的最后一行出现以下错误:
过载解析失败,因为无法访问“选择”
用以下参数调用:
我究竟做错了什么?
最佳答案
(根据评论...)
问题是您正在尝试使用LINQ to Objects(使用IEnumerable<T>
和委托)和基于Queryable的LINQ(使用IQueryable<T>
和表达式树)的混合。您不能传递Enumerable<T>
表达式树。
三种选择:
首先将集合转换为IQueryable<T>
:
DateTime maxdate = this.EntityCollection.AsQueryable().Select(lambda).Max();
首先将表达式树转换为委托:
DateTime maxdate = this.EntityCollection.Select(lambda.Compile()).Max();
更改您的方法以接受
IQueryable<T>
而不是IEnumerable<T>