SQL to Entity Framework Count Group-By
мне нужно перевести этот SQL
заявление Linq-Entity
запрос...
SELECT name, count(name) FROM people
GROUP by name
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