如何在服务器端 EF Core 3 上进行 GroupBy 调用

How to make a GroupBy call on the server side EF Core 3

关于这个主题的问题太多了,当然我已经尝试澄清我的误解,谷歌搜索现有答案,但似乎我需要更多细节。

事实证明,在 EF Core 2 GroupBy 在客户端执行之前,无论你是否想要它。但在 EF 3 Core 中,该行为已更改,现在您必须通过调用 ToList 或其他方式在客户端 显式 上执行它,然后使用 IEnumerableGroupBy。所以通过这种方法,我们总是知道可能分配大内存的风险。

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client

但是我想在服务器端执行GroupBy。就是这样。那我该怎么办?创建程序?另外我很感兴趣为什么一开始它不在服务器端执行?

我的情况很简单:我想获取一些列值最大的组的记录。就像屏幕截图上的那个人试图那样做,但在服务器级别。

我最接近的是:

var query = _dbContext.ReportVersions
    .Select(version => version.VersionGroupId).Distinct()
    .SelectMany(key => _dbContext.Reports.Where(report => report.ReportVersion.VersionGroupId == key)
        .OrderByDescending(report => report.ReportVersion.CreatedAt)
        .Select(report => new
        {
            Id = report.Id,
           // etc
        })
        .Take(1))
    .ToListAsync(cancellationToken);

它提醒 group by,正如您首先看到的,我正在寻找唯一值 (VersionGroupId),然后我正在寻找具有该 VersionGroupId 的报告,然后对它们进行排序。现在我得到了“组”中的所有记录,并且我在每个记录中排名第一。

这是通过子查询完成的,但是使用这种方法您不会在内存中加载不需要的实体。