EF Core Group By поддержка перевода на условную сумму - PullRequest
0 голосов
/ 03 мая 2018

Я был очень рад услышать, что EF Core 2.1 будет поддерживать группу при переводе. Я скачал предварительный просмотр и начал тестировать его, но обнаружил, что я все еще не получаю групп по переводам в ряде мест.

В приведенном ниже фрагменте кода запрос для TotalFlagCases будет препятствовать работе группы при переводе. В любом случае, я могу переписать это, чтобы я мог иметь группу по поддержке? Или, может быть, другой подход, который я могу использовать?

В этой таблице много строк, и я не хочу, чтобы .NET пришлось загружать все эти строки. Я также использую данные на уровне строк, но только около 15 записей одновременно.

var headerTask = (from c in cases
    group c by 1
    into g
    select new CaseHeader
    {
        TotalCases = g.Count(),
        // ... A number of other aggregates
        TotalFlagCases = g.Where(a => a.Flag).Sum(b => 1),
    })
.DefaultIfEmpty(new CaseHeader()).FirstAsync();

1 Ответ

0 голосов
/ 04 мая 2018

В этой версии EF Core есть способ сделать условную сумму. При условии, что код не будет переведен в требуемый SQL с GROUP BY, но, возможно, какая-то будущая версия будет поддерживать его таким образом. Сейчас вы можете попробовать что-то вроде этого:

var headerTask = cases
    .Select(c => new
    {
        c.Flag,
        c.YourKey,
        //other properties
    })
    .GroupBy(c => c.YourKey, (k, g) => new CaseHeader
    {
        TotalCases = g.Count(),
        // ... A number of other aggregates
        TotalFlagCases = g.Sum(b => a.Flag ? 1 : 0)
    });

Когда вы проецируете свою сущность в анонимный тип, а затем группируете ее и используете условный оператор в статистической функции, она будет преобразована в SQL с GROUP BY и агрегатами, такими как:

SELECT COUNT(*) AS [TotalCases], SUM(CASE
    WHEN [c].[Flag] = 1
    THEN 1 ELSE 0
END) AS [TotalFlagCases]
FROM [Cases] AS [c]
GROUP BY [c].[YourKey]

Если вы не проецируете его на анонимный тип, поэтому, если отсутствует указанная выше Select функция, она не будет преобразована в SQL с GROUP BY. Похоже, что переводчик запросов для этого предварительного выпуска не поддерживает его или это ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...