将 Func 传递给 Linq 到实体 Sum(..)
Posted
技术标签:
【中文标题】将 Func 传递给 Linq 到实体 Sum(..)【英文标题】:Passing Func to Linq to Entities Sum(..) 【发布时间】:2017-05-06 20:44:19 【问题描述】:我正在尝试创建一种方法,该方法将一个实体分组到几个字段上,然后获取另一个字段中的一些。像这样:
private async Task<List<KpiGrounping<int>>> GetGrouping(IQueryable<MyEntityType> query, Func<MyEntityType, int> selector)
return await (from item in entity
group itemby new
item.DimCountry.Geo,
item.DimPlatform.Platform
into x
select new MyGrounpingDto
Geo = x.Key.Geo.Trim(),
Platform = x.Key.Platform.Trim(),
Value = x.Sum(selector)
).ToListAsync();
我称之为var foo = GetGrouping(context.MyEntities, x=>x.MyValue);
当我这样做时,我收到错误:“内部 .NET Framework 数据提供程序错误 1025。”抛出 - 我几乎无法理解。
我还发现,如果我不传入选择器,而是直接调用 sum,比如Value = x.Sum(s => s.MyValue);
,那么它可以正常工作
【问题讨论】:
将selector
参数类型改为Expression<Func<MyEntityType, int>>
然后我收到错误消息,即项目“x”不包含“总和”的定义。然后调用 x.AsQueryable().Sum(selector) 即可。谢谢!
【参考方案1】:
您是否尝试过这样做:
private async Task<List<KpiGrounping<int>>> GetGrouping(IQueryable<MyEntityType> query, Expression<Func<MyEntityType, int>> selector)
return await (from item in entity
group itemby new
Geo = item.DimCountry.Geo.Trim(),
Platform = item.DimPlatform.Platform.Trim()
into x
select new MyGrounpingDto
Geo = x.Key.Geo,
Platform = x.Key.Platform,
Value = x.Sum(selector)
).ToListAsync();
【讨论】:
是的,正如@Yacoub Massad 所建议的那样。但我必须将值分配更改为:x.AsQueryable().Sum(selector)以上是关于将 Func 传递给 Linq 到实体 Sum(..)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Func<T, string> lambda 动态构造 where 子句 - linq 到实体
3 layered & Linq to Sql - 业务实体
如何在 LINQ where 子句中传递 func 表达式?