将 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=&gt;x.MyValue);

当我这样做时,我收到错误:“内部 .NET Framework 数据提供程序错误 1025。”抛出 - 我几乎无法理解。

我还发现,如果我不传入选择器,而是直接调用 sum,比如Value = x.Sum(s =&gt; s.MyValue);,那么它可以正常工作

【问题讨论】:

selector参数类型改为Expression&lt;Func&lt;MyEntityType, int&gt;&gt; 然后我收到错误消息,即项目“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 表达式?

单元测试错误:此函数只能从 LINQ 调用到实体

将 RowData 传递给 Jqgrid 中的 Custom_func

Linq to entity 使用“Func”在生成匿名对象的选择语句中创建属性