Contagem de quadros SQL para Entidade Grupo-A
preciso traduzir esta declaração SQL
para uma consulta Linq-Entity
...
SELECT name, count(name) FROM people
GROUP by name
4 answers
Sintaxe da Pesquisa
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() });
Editar: EF Core 2.1 suporta finalmente GroupBy
Mas procure sempre na consola / Registo as mensagens. Se você ver uma notificação de que sua consulta não poderia ser convertida para SQL e será avaliada localmente, então você pode precisar reescrevê-la.
O Entity Framework 7 (agora renomeado para Entity Framework Core 1.0 / 2.0) ainda não suporta GroupBy()
a tradução para GROUP BY
em SQL gerado (mesmo na versão final 1.0 que não suporta). As a lógica de agrupamento será executada no lado do cliente, o que pode fazer com que muitos dados sejam carregados.
Eventualmente, um código escrito como este irá automaticamente começar a usar o grupo por, mas por agora você precisa ser muito cauteloso se carregar todo o seu conjunto de dados não agrupados na memória irá causar problemas de desempenho.
Para cenários onde isto é um quebra-negócio, terá de escrever o SQL à mão e executá-lo através da EF.
Em caso de dúvida, Acenda o perfil Sql e veja o que é gerado. - o que devias estar a fazer.Https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2
Uma extensão útil é recolher os resultados num Dictionary
para uma pesquisa rápida (por exemplo, num ciclo):
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
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() });