EF Core Group By с отложенным выполнением и группировкой на стороне SQL - PullRequest
0 голосов
/ 09 декабря 2018

Использование EF Core 2.1, который поддерживает групповую трансляцию, но не после того, как я спроецировал значение ключа.

У меня есть запрос, который должен разрешить диапазон типов группировки и диапазон типов агрегатов.

Группировка по: Год, Год / Месяц, Год / Месяц / День и т. Д.

Совокупность по: Ср., Сумма, Мин., Макс. И т. Д.

Я создал два switchзаявления, один для группировки и один для агрегации.Моя проблема в том, что я не могу отложить выполнение и выполнить группировку в SQL.Если нет, то результирующий набор данных будет довольно большим.

Является ли какой-либо из этих подходов разумным или я должен просто использовать необработанный запрос?

Это отложено и сгруппировано по желанию, но тип ключауникален для года / месяца, и я не могу предоставить общее решение для агрегатов во втором switch, если бы я хотел сгруппировать что-то другое, например год / месяц / день.

var query1 = series
     .GroupBy(k => new { k.Created.Year, k.Created.Month, });

var result1 = query1
    .Select(i => new { i.Key, Value = i.Average(a => a.DataValue) });

Как только вы преобразуете ключ в строку, группировка происходит на стороне клиента:

var query2 = series
      .GroupBy(k => k.Created.Year.ToString());

var result2 = query2
    .Select(i => new { i.Key, Value = i.Average(a => a.DataValue) });

Это также вызывает группирование на стороне клиента:

var query3 = series
     .GroupBy(k => new { k.Created.Year, k.Created.Month, })
     .Select(i => new
     {
         Key = $"{i.Key.Year}-{i.Key.Month}",
         Values = i.ToList()
     });

Любые идеи, как это сделатьзапрос?В идеале мне нужен общий групповой ключ, который группирует на стороне сервера, или метод передачи агрегата на основе функции в запросе.Генерация ключа на основе string обеспечивает группировку на стороне клиента.

1 Ответ

0 голосов
/ 09 декабря 2018

Единственный способ получить перевод SQL в EF Core 2.1 (и 2.2) - это сгруппировать по составному анонимному условно, включая нужные части данных:

bool includeYear = ...;
bool includeMonth = ...;
bool includeDay = ...;
bool includeHour = ...;

var query1 = series
    .GroupBy(e => new
    {
        Year = includeYear ? e.CreatedDate.Year : 0,
        Month = includeMonth ? e.CreatedDate.Month : 0,
        Day = includeDay ? e.CreatedDate.Day : 0,
        Hour = includeHour ? e.CreatedDate.Hour : 0
    });

Как ни странно, если я создам специальный класс для группового ключа с точно такими же свойствами, что и у анонимного типа, и изменим new { ... } на new MyKeyType { ... }, EF Core переключится на оценку клиента.

Вскоре, GroupBy (и не только) перевод SQL все еще нестабилен.Похоже, нам нужно подождать 3.0, чтобы в итоге получить улучшения в этой области.

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