J'ai besoin de traduire cette SQL
déclaration en Linq-Entity
requête ...
SELECT name, count(name) FROM people
GROUP by name
la source
J'ai besoin de traduire cette SQL
déclaration en Linq-Entity
requête ...
SELECT name, count(name) FROM people
GROUP by name
Syntaxe de la 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 recherchez toujours les 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 qu'elle 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 la GroupBy()
traduction GROUP BY
en SQL généré (même dans la version 1.0 finale, ce n'est pas le cas). Toute logique de regroupement s'exécutera du côté client, ce qui pourrait entraîner le chargement d'un grand nombre de données.
Finalement, le code écrit comme celui-ci commencera automatiquement à utiliser GROUP BY, mais pour l'instant, vous devez être très prudent si le chargement de l'ensemble de votre ensemble de données non groupé en mémoire entraîne 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é - 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 est de collecter les résultats dans une
Dictionary
recherche rapide (par exemple dans une boucle):À l'origine trouvé ici: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
la source
Voici un exemple simple de group by 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]
la source
avec EF 6.2 cela a fonctionné pour moi
la source