Preciso traduzir esta SQL
declaração em uma Linq-Entity
consulta ...
SELECT name, count(name) FROM people
GROUP by name
Preciso traduzir esta SQL
declaração em uma Linq-Entity
consulta ...
SELECT name, count(name) FROM people
GROUP by name
Respostas:
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 BY
em 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
Uma extensão útil é coletar os resultados em uma Dictionary
pesquisa 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
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]
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() });