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

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


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


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]

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() });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.