Abbiamo aggiornato un servizio da .Net Core 2.1 a 3.1, rivalutando le query che si sono interrotte o sono diventate più lente durante la transizione, ci siamo imbattuti in questa query:
_context.InboundRecords.GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
Per far sì che questo "funzioni" con le modifiche di rottura 3.1, aggiungiamo un elenco a tra DBSet e Group By
_context.InboundRecords.ToList().GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
Il problema qui è che questo porta in memoria l'insieme del db InboundRecords prima di eseguire il raggruppamento. Questo è identico al modo in cui 2.1 ha funzionato, ma ci deve essere un modo migliore per farlo. Possiamo modificare questa query per riportare solo lo stato e il conteggio dei record in quello stato?
Possiamo modificare questa query per riportare solo lo stato e il conteggio dei record in quello stato?
Certo che possiamo, (1) utilizzando GroupBy
lato server con proiezione intermedia contenente solo chiavi / aggregati, quindi (2) convertirlo lato client nella forma desiderata:
_context.InboundRecords
.GroupBy(x => x.State.ToString())
.Select(g => new { g.Key, Count = g.Count() }) // (1)
.ToDictionary(x => x.Key, x => Count); // (2)