SQL для Entity Framework Count Group-By


Ответы:


181

Синтаксис запроса

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

Синтаксис метода

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

Изменить: EF Core 2.1 наконец-то поддерживает GroupBy

Но всегда ищите сообщения в консоли / журнале. Если вы видите уведомление о том, что ваш запрос не может быть преобразован в SQL и будет оцениваться локально, возможно, вам придется его переписать.


Entity Framework 7 (теперь переименованный в Entity Framework Core 1.0 / 2.0 ) еще не поддерживает GroupBy()преобразование GROUP BYв сгенерированный SQL (даже в последней версии 1.0 этого не произойдет). Любая логика группирования будет выполняться на стороне клиента, что может вызвать загрузку большого количества данных.

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

В сценариях, где это нарушает условия сделки, вам придется написать SQL вручную и выполнить его через EF.

Если вы сомневаетесь, запустите Sql Profiler и посмотрите, что сгенерировано - что вам, вероятно, все равно следует делать.

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


5
Спасибо за предупреждение
Джейкоб Штамм

4
Также нет группировки в 1.1
Simon_Weaver

4
или 1,2 или 2,0. Я сдаюсь
Simon_Weaver

4
он объявлен для 2.1
Yush0

Это может вводить в заблуждение, я думаю, что важно обновить свой ответ и прямо упомянуть, что версии EF до EF 7 поддерживают группировку. Этот ответ, который является скорее комментарием, чем фактическим ответом на вопрос OP, вводит в заблуждение, когда читается сам по себе (и интерпретируется как ответ на OP, который не является). Читая это, можно создать неверное впечатление, будто даже EF 7 не поддерживает группировку, и, очевидно, более ранние версии не поддерживают ее, что просто неверно.
BornToCode

14

Полезное расширение - это сбор результатов Dictionaryдля быстрого поиска (например, в цикле):

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);

Первоначально найдено здесь: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c


1

Вот простой пример group by в .net core 2.1

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

Что означает:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

0

с EF 6.2 это сработало для меня

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.