Nombre de cadres SQL à Entity Group-By
Je dois traduire cette instruction SQL
en une requête Linq-Entity
...
SELECT name, count(name) FROM people
GROUP by name
4 réponses
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() });
Edit: EF Core 2.1 prend enfin en charge GroupBy
Mais toujours regarder dans la console / journal pour les messages. 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 (maintenant renommé Entity Framework Core 1.0 / 2.0) ne prend pas encore en charge GroupBy()
pour la traduction en GROUP BY
dans SQL généré (même dans la version finale 1.0, il ne le sera pas). Tout groupement la logique s'exécutera du côté client, ce qui pourrait entraîner le chargement de beaucoup de données.
Finalement, le code écrit comme ceci commencera automagiquement à utiliser GROUP BY, mais pour l'instant, vous devez être très prudent si le chargement de l'ensemble de vos données non groupées en mémoire entraînera des problèmes de performances.
Pour les scénarios où il s'agit d'un deal-breaker, vous devrez écrire le SQL à la main et l'exécuter via EF.
En cas de doute Lancez Sql Profiler et voyez ce qui est généré-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 est de rassembler les résultats dans un Dictionary
pour la recherche rapide (par exemple, dans une 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() });