【问题标题】:EF Core - multiple counts in one sql requestEF Core - 一个 sql 请求中的多个计数
【发布时间】:2018-06-30 20:30:39
【问题描述】:

我试图从一个表中获取多个计数统计信息,但没有得到我想要的。

代码

var result = _db.Users.Select(g => new
{
    count = _db.Users.Count(),
    acCount = _db.Users.Count(u => u.User.State == AccountState.AwaitingConfirmation)
});

Sql 请求

SELECT (
    SELECT COUNT(*)
    FROM `users` AS `c`
) AS `count`, (
    SELECT COUNT(*)
    FROM `users` AS `u`
    INNER JOIN `users` AS `u.User` ON `u`.`UserId` = `u.User`.`Id`
    WHERE `u.User`.`State` = 4
) AS `acCount`
FROM `users` AS `g`

预期结果

result = { count = ?, acCount = ? }

实际结果(表中有 4 个用户)

result = [
    { count = ?, acCount = ? },
    { count = ?, acCount = ? },
    { count = ?, acCount = ? },
    { count = ?, acCount = ? }
]

显然这是错误的,因为我使用的是 Select,它给了我 N 次计数(N 是 users 表中的行数)。
我想要的是能够一次直接地获得这些计数,最好是在一个请求中。

我也尝试过GroupBy(i => 1),但这会产生很多 sql 请求..

谢谢。

【问题讨论】:

  • 你能更清楚地显示预期的结果吗?即,请详细说明问题本身以及您想要得到的确切内容(我没有得到您想要得到的内容)。
  • 请看我的编辑。
  • 那么你想将每个count 值添加到前一个值吗?
  • 我需要 2 个计数,我的查询给了我 2 个计数 * 表中的行数。
  • 按常量分组 (1) 技术在最新的 EF Core 2.1 中有效(我的意思是,使用单个 SQL) - 请参阅 stackoverflow.com/questions/50916302/…

标签: c# asp.net-core entity-framework-core


【解决方案1】:

由于_db.Users.Select 语句,正在为用户的每一行执行查询。

您可以使用以下查询仅从表中获取计数:

var counts = new {
    count = _db.Users.Count(),
    acCount = _db.Users.Count(u => u.User.State == AccountState.AwaitingConfirmation)
};

在单个查询中获取两个计数 - 如 cmets 中所述(注意使用标志来识别等待确认并按常量分组,然后使用 sum 根据标志获取计数):

  var counts = 
     _db.Users
    .Select(e => new { AwaitingConfirmation = 
             u.User.State == AccountState.AwaitingConfirmation ? 1 : 0 })
    .GroupBy(e => 1)
    .Select(g => new
    {
        Count = g.Count(),
        account = g.Sum(e => e.AwaitingConfirmation)
    }).FirstOrDefault();

【讨论】:

  • 将其与First 一起使用可得到最大为 1 的计数。
  • 不管怎样,我最终还是使用了.ToArray()[0],尽管它很丑。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多