0

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

对我来说,在 EF Core 2GroupBy在客户端执行之前,不管你想要与否。但在 EF 3 Core 中,该行为已更改,现在您必须在客户端上显式执行它,方法是调用ToList或其他方法,然后使用IEnumerable's GroupBy。因此,通过这种方法,我们总是知道可能分配大内存的风险。

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/break-changes#linq-queries-are-no-longer-evaluated-on-客户端

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

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

在此处输入图像描述

4

1 回答 1

0

我最接近的是:

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 的报告,并对其进行排序。现在我已经获得了“组”中的所有记录,并且我在每个记录中都名列前茅。

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

于 2021-04-09T23:03:56.337 回答