将lambda作为变量传递给.Select()

时间:2015-06-05 00:00:30

标签: c# linq lambda

我想根据条件将lambda传递给我的.Select()方法。

我把我的lambda设置为:

Func<Monthly, int?> f = x => x.CLDD;
然后我按照这样设置我的.Select():

IQueryable query =
 db.Monthlies
 .GroupBy(o => o.Date.Value.Year)
 .Select(
   o => new {
     Year = o.Key,
     MaxDate = o.Max(x => x.Date),
     Data = o.Sum(f)
   }
 )
 .Where(o => o.Year != currentYear)
 .OrderBy(o => o.Year);

代码编译并运行正常,但查询不会发回任何结果。当我调试并观察查询时,我看到它说:

+ base {"Internal .NET Framework Data Provider error 1025."}
System.SystemException {System.InvalidOperationException}

请注意我是这样做的:

Expression<Func<Monthly, int?>> f = x => x.CLDD;

然后o.Sum(f)错误说:

Error   1   Instance argument: cannot convert from 
'System.Linq.IGrouping<int,MyWeb.Models.Monthly>' to
System.Linq.IQueryable<MyWeb.Models.Monthly>'

谢谢!

1 个答案:

答案 0 :(得分:2)

您很接近,实体框架需要Expression才能使用Func,但收到Sum的{​​{1}}扩展方法仅适用于Expression

现在在IQueryable内,您从Select获得IGrouping,但GroupByIQueryable {。}}。

所以你只需要将其转换为正确的扩展方法:

IEnumerable