首页 > 解决方案 > 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 的工作方式相同,但必须有更好的方法来做到这一点。我们可以调整这个查询只带回状态和该状态下的记录数吗?

标签: linqentity-framework-coreef-core-3.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)

推荐阅读