SQL para Entity Framework Count Group-By

Respostas:

190

Sintaxe de consulta

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

Sintaxe do método

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

Editar: EF Core 2.1 finalmente suporta GroupBy

Mas sempre procure no console / log por mensagens. Se você vir uma notificação de que sua consulta não pôde ser convertida para SQL e será avaliada localmente, talvez seja necessário reescrevê-la.


O Entity Framework 7 (agora renomeado para Entity Framework Core 1.0 / 2.0 ) ainda não oferece suporte GroupBy()para conversão GROUP BYem SQL gerado (mesmo na versão 1.0 final isso não acontecerá). Qualquer lógica de agrupamento será executada no lado do cliente, o que pode fazer com que muitos dados sejam carregados.

Eventualmente, o código escrito como este começará a usar o GROUP BY automaticamente, mas por enquanto você precisa ser muito cauteloso se o carregamento de todo o conjunto de dados não agrupado na memória causar problemas de desempenho.

Para cenários em que isso é um problema, você terá que escrever o SQL manualmente e executá-lo por meio do EF.

Em caso de dúvida, inicie o Sql Profiler e veja o que é gerado - o que você provavelmente deveria estar fazendo de qualquer maneira.

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

Simon_Weaver
fonte
6
Obrigado pelo aviso
Jacob Stamm
4
Também sem agrupamento em 1.1
Simon_Weaver
5
ou 1.2 ou 2.0. Eu desisto
Simon_Weaver
4
é anunciado para 2.1
Yush0
Isso pode ser enganoso, acho importante atualizar sua resposta e mencionar explicitamente que as versões do EF anteriores ao EF 7 oferecem suporte a agrupamento. Esta resposta, que é mais um comentário do que uma resposta real à pergunta do PO, é enganosa quando lida por si mesma (e é interpretada como uma resposta ao PO que não é). Ao ler isso, pode-se ficar com a impressão errada de que mesmo o EF 7 não suporta agrupamento e, obviamente, versões anteriores não suportam, o que simplesmente não é verdade.
BornToCode de
14

Uma extensão útil é coletar os resultados em uma Dictionarypesquisa rápida (por exemplo, em um loop):

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

Originalmente encontrado aqui: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

Christian Moser
fonte
3

Aqui está um exemplo simples de grupo em .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()};

O que se traduz em:

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

com EF 6.2 funcionou para mim

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