【问题标题】:Group By and To Dictionary in EF Core 3.1EF Core 3.1 中的 Group By 和 To 字典
【发布时间】:2020-07-07 07:25:53
【问题描述】:

我们已将服务从 .Net Core 2.1 更新到 3.1,在重新评估过渡期间中断或变慢的查询时,我们遇到了以下查询:

_context.InboundRecords.GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())

为了使这个“工作”与 3.1 的重大更改,我们在 DBSet 和 Group By 之间添加一个列表

_context.InboundRecords.ToList().GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())

这里的问题是,在进行分组之前,这会将整个 InboundRecords 数据库集带入内存。这与 2.1 的工作方式相同,但必须有更好的方法来做到这一点。我们可以调整这个查询以只返回状态和该状态下的记录数吗?

【问题讨论】:

  • 当您必须尽早切换到客户端评估时,我希望(推测)AsEnumerableToList 更可取。这可能会在新版本的 EF Core 中得到改进,因为他们已同意考虑改进 GroupBy 翻译。

标签: linq entity-framework-core ef-core-3.1


【解决方案1】:

我们能否调整此查询以仅返回状态和该状态下的记录数?

当然我们可以,通过 (1) 使用服务器端 GroupBy 和仅包含键/聚合的中间投影,然后 (2) 将其转换为客户端所需的形状:

_context.InboundRecords
    .GroupBy(x => x.State.ToString())
    .Select(g => new { g.Key, Count = g.Count() }) // (1)
    .ToDictionary(x => x.Key, x => Count); // (2)

【讨论】:

  • 我不得不稍微调整一下 _context.InboundRecords.GroupBy(x => x.State).Select(x => new { x.Key, RowCount = x.Count() })。 ToDictionary(x => x.Key.ToString(), x => x.RowCount) 看起来还是有点慢,但是好多了。问题是 State 是一个枚举,所以它不喜欢 tostring 过早
  • @MarshallTigerus 有道理。但从根本上说,这并没有改变上述原则。
  • 我没有不同意你的观点,感谢您的解释
  • 我一直在努力解决这个问题。这需要更多的支持!
猜你喜欢
  • 2022-01-16
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2011-05-18
  • 2012-10-26
相关资源
最近更新 更多