SQL to Entity Framework Count Group-By


мне нужно перевести этот SQL заявление Linq-Entity запрос...

SELECT name, count(name) FROM people
GROUP by name
4 61

4 ответа:

синтаксис

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() });

Edit: 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

полезным расширением является сбор результатов в 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

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

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