我正在尝试为此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>

10-07 12:31