如何在服务器端 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
或其他方式在客户端 显式 上执行它,然后使用 IEnumerable
的GroupBy
。所以通过这种方法,我们总是知道可能分配大内存的风险。
但是我想在服务器端执行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 的报告,然后对它们进行排序。现在我得到了“组”中的所有记录,并且我在每个记录中排名第一。
这是通过子查询完成的,但是使用这种方法您不会在内存中加载不需要的实体。
关于这个主题的问题太多了,当然我已经尝试澄清我的误解,谷歌搜索现有答案,但似乎我需要更多细节。
事实证明,在 EF Core 2 GroupBy
在客户端执行之前,无论你是否想要它。但在 EF 3 Core 中,该行为已更改,现在您必须通过调用 ToList
或其他方式在客户端 显式 上执行它,然后使用 IEnumerable
的GroupBy
。所以通过这种方法,我们总是知道可能分配大内存的风险。
但是我想在服务器端执行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 的报告,然后对它们进行排序。现在我得到了“组”中的所有记录,并且我在每个记录中排名第一。
这是通过子查询完成的,但是使用这种方法您不会在内存中加载不需要的实体。