EF Core - несколько подсчетов в одном запросе sql - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь получить статистику по нескольким счетам из таблицы, но не получаю то, что хочу.

код

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 - количество строк в таблице пользователей).
Что я хочу, так это чтобы можно было получать эти подсчеты напрямую и один раз, предпочтительно за один запрос.

Я также пытался GroupBy(i => 1), но это дает много запросов SQL ..

Спасибо.

1 Ответ

0 голосов
/ 30 июня 2018

Запрос выполняется для каждой строки пользователя из-за оператора _db.Users.Select.

Вы можете использовать запрос ниже, чтобы получить только счет из таблиц:

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

Чтобы получить оба значения в одном запросе - как упомянуто в комментариях (обратите внимание на использование флага для определения ожидающего подтверждения и группировки по константам, а затем на использование суммы для получения количества на основе флага):

  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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...