使用同一列进行多次计数的 EF Core Linq

问题描述 投票:0回答:1

我正在根据同一列的条件计算记录总数,基本上,这就是我现在所拥有的:

var checkTotal = await _dbRO.AllOpenExceptions
    .Where(x => x.ClientId == _user.ClientId)
    .CountAsync(x => x.ExceptionType == "Check");

var achTotal = await _dbRO.AllOpenExceptions
    .Where(x => x.ClientId == _user.ClientId)
    .CountAsync(x => x.ExceptionType == "ACH");

如您所见,我只需要计算 ExceptionType 列是“Check”与“ACH”的记录数。有没有办法将这两个单独的查询合并为一个查询?

我尝试过使用 select 进行分组,但无法弄清楚确切的语法。感谢您的帮助!

c# entity-framework entity-framework-core
1个回答
1
投票

我们可以使用clientId和ExceptionType对数据进行分组和过滤,然后将其转换为字典:

var totals = await _dbRO.AllOpenExceptions
                        .Where(x => x.ClientId == clientId && (x.ExceptionType == "ACH" || x.ExceptionType == "Check"))
                        .GroupBy(x => new { x.ClientId, x.ExceptionType })
                        .ToDictionaryAsync(
                              key => key.Key.ExceptionType,
                              value => value.Count(),
                              cancellationToken);

如果您没有取消令牌,请将其删除。现在您可以通过按键 ACHCheck 访问您的总计。

var achTotal = totals["ACH"];
var checkTotal = totals["Check"];

更进一步并避免一些异常,您甚至可以使用 TryGetValue 方法:

totals.TryGetValue("ACH", out var achTotal);
totals.TryGetValue("Check", out var checkTotal);
© www.soinside.com 2019 - 2024. All rights reserved.