Nous avons mis à jour un service de .Net Core 2.1 à 3.1, tout en réévaluant les requêtes qui se sont rompues ou sont devenues plus lentes pendant la transition, nous sommes tombés sur cette requête:
_context.InboundRecords.GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
Pour que cela "fonctionne" avec les changements de rupture 3.1, nous ajoutons une liste à entre le DBSet et le Group By
_context.InboundRecords.ToList().GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
Le problème ici est que cela amène l'intégralité du jeu de bases de données InboundRecords en mémoire avant de procéder au regroupement. C'est identique à la façon dont fonctionnait la 2.1, mais il doit y avoir une meilleure façon de le faire. Pouvons-nous modifier cette requête pour ne ramener que l'état et le nombre d'enregistrements dans cet état?
Pouvons-nous modifier cette requête pour ne ramener que l'état et le nombre d'enregistrements dans cet état?
Bien sûr, nous pouvons (1) utiliser GroupBy
côté serveur avec une projection intermédiaire contenant uniquement des clés / agrégats, puis (2) le convertir côté client à la forme souhaitée:
_context.InboundRecords
.GroupBy(x => x.State.ToString())
.Select(g => new { g.Key, Count = g.Count() }) // (1)
.ToDictionary(x => x.Key, x => Count); // (2)