【问题标题】:Passing Func to Linq to Entities Sum(..)将 Func 传递给 Linq 到实体 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) 即可。谢谢!

标签: c# entity-framework linq entity-framework-6 linq-to-entities


【解决方案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)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多