Подтвердить что ты не робот

SQL-Entity Framework Count Group-By

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

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

Ответ 1

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

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

Ответ 2

Редактировать: 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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Вот простой пример группировки в .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]