Сгруппировать и словарь в EF Core 3.1 - PullRequest
1 голос
/ 26 марта 2020

Мы обновили сервис с. Net Core 2.1 до 3.1, переоценивая запросы, которые прервались или стали медленнее во время перехода, мы натолкнулись на этот запрос:

_context.InboundRecords.GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())

Чтобы это работало "с изменениями 3.1 мы добавляем список между DBSet и группой.

_context.InboundRecords.ToList().GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())

Проблема здесь в том, что это приводит к полноте набора данных InboundRecords, установленного в памяти, перед группировкой. Это идентично тому, как работал 2.1, но должен быть лучший способ сделать это. Можем ли мы настроить этот запрос, чтобы вернуть только состояние и количество записей в этом состоянии?

1 Ответ

1 голос
/ 26 марта 2020

Можем ли мы настроить этот запрос, чтобы вернуть только состояние и количество записей в этом состоянии?

Конечно, мы можем, (1) используя сторону сервера GroupBy с промежуточная проекция, содержащая только ключи / агрегаты, затем (2) преобразует ее на стороне клиента в желаемую форму:

_context.InboundRecords
    .GroupBy(x => x.State.ToString())
    .Select(g => new { g.Key, Count = g.Count() }) // (1)
    .ToDictionary(x => x.Key, x => Count); // (2)
...