J'ai besoin de traduire cette instruction SQL
en une requête Linq-Entity
...
SELECT name, count(name) FROM people
GROUP by name
Syntaxe de requête
var query = from p in context.People
group p by p.name into g
select new
{
name = g.Key,
count = g.Count()
};
Syntaxe de la méthode
var query = context.People
.GroupBy(p => p.name)
.Select(g => new { name = g.Key, count = g.Count() });
Mais cherchez toujours des messages dans la console/le journal. Si vous voyez une notification indiquant que votre requête n'a pas pu être convertie en SQL et sera évaluée localement, vous devrez peut-être la réécrire.
Entity Framework 7 (désormais renommé Entity Framework Core 1.0/2.0) ne prend pas encore en charge GroupBy()
pour la traduction en GROUP BY
dans le code SQL généré (même dans la version 1.0 finale, il ne le fera pas). Toute logique de regroupement s'exécutera côté client, ce qui pourrait entraîner le chargement de nombreuses données.
Finalement, le code écrit comme ceci commencera automatiquement avec GROUP BY, mais pour le moment, vous devez être très prudent si le chargement de la totalité de votre jeu de données non groupé dans la mémoire risque de provoquer des problèmes de performances.
Pour les scénarios où il s'agit d'un briseur de transaction, vous devrez écrire le code SQL à la main et l'exécuter via EF.
En cas de doute, lancez Sql Profiler et voyez ce qui est généré - ce que vous devriez probablement faire de toute façon.
https://blogs.msdn.Microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2
Une extension utile consiste à collecter les résultats dans une Dictionary
pour une recherche rapide (par exemple, en boucle):
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);
Trouvé à l'origine ici: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
avec EF 6.2 cela a fonctionné pour moi
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });
Voici un exemple simple de groupe par dans .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()};
Ce qui se traduit par:
SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]