Hemos actualizado un servicio de .Net Core 2.1 a 3.1, mientras reevaluamos las consultas que se rompieron o se hicieron más lentas durante la transición, encontramos esta consulta:
_context.InboundRecords.GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
Para hacer que esto "funcione" con los cambios de ruptura 3.1, agregamos una lista entre DBSet y Group By
_context.InboundRecords.ToList().GroupBy(x => x.State.ToString()).ToDictionary(x => x.Key, x => x.Count())
El problema aquí es que esto trae la totalidad del conjunto de bases de datos InboundRecords a la memoria antes de hacer la agrupación. Esto es idéntico a la forma en que funcionaba 2.1, pero tiene que haber una mejor manera de hacerlo. ¿Podemos ajustar esta consulta para recuperar solo el estado y el recuento de registros en ese estado?
¿Podemos ajustar esta consulta para recuperar solo el estado y el recuento de registros en ese estado?
Claro que podemos, (1) usando GroupBy
lado del servidor con proyección intermedia que contiene solo claves / agregados, luego (2) convertirlo del lado del cliente a la forma deseada:
_context.InboundRecords
.GroupBy(x => x.State.ToString())
.Select(g => new { g.Key, Count = g.Count() }) // (1)
.ToDictionary(x => x.Key, x => Count); // (2)