linq - EF Core 3.1 中的 Group By 和 To 字典
问题描述
我们已将服务从 .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 的工作方式相同,但必须有更好的方法来做到这一点。我们可以调整这个查询只带回状态和该状态下的记录数吗?
解决方案
我们可以调整这个查询以只带回状态和该状态下的记录数吗?
当然,我们可以通过 (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)
推荐阅读
- c++ - 具有捆绑属性的 boost::graph metric_tsp_approx 在运行时失败
- c# - .NET Confluent Kafka 消费者内存泄漏
- angularjs - IE11 + Angular 1.5.11 上的奇怪渲染行为
- cassandra - DataStax java.lang.AssertionError:无效的偏移量
- angular2-nativescript - 键盘上方的 Nativescript 移动按钮
- excel - 我们可以从 Excel VBA 连接到 Redshift 吗?
- powershell - 如何在 PowerShell GUI 可执行文件中嵌入图标?
- css - 如何在 Bootstrap 4 中使用 Font Awesome 中的 svg 图标?
- java - 从文件中检测空像素
- java - 我无法从 Firebase (Java) 获取特定数据