diciembre 13, 2022
En ocasiones para optimizar consultas con datos calculados parciales, tenemos la opción de reutilizarlos mediante sub-expresiones en una sola iteración. En este ejemplo reutilizamos un cálculo (sencillo para el ejemplo), en lugar de realizar el sumatorio o la llamada a una función para cualquier cálculo…
entidad.misDatos.Where(x => x.id(algunID))
.GroupBy(x => x.otraTabla)
.Select(m => new miClaseParcial
{
id = m.id,
totalUnidades = m.Sum(x => x.unidades),
disponible = (m.Sum(x => x.unidades) > m.miTablaConfig.unidades_minimas) ? true : false,
proximoPedido = (m.miTablaConfig.pedido_minimo - m.Sum(x => x.unidades)),
prevision = calcularPrevision(m.Sum(x => x.unidades))
}).ToList();
Generamos una sub-expresión con el valor que reutilizamos:
entidad.misDatos.Where(x => x.id(algunID))
.GroupBy(x => x.otraTabla)
.Select(m => new miClaseParcial
{
id = m.Key.id,
totalUnidades = m.Sum(x => x.unidades),
disponible = false,
proximoPedido = 0,
prevision = 0
})
.Select(m => new miClaseParcial
{
id = m.id,
totalUnidades = m.totalUnidades,
disponible = (m.totalUnidades > m.miTablaConfig.unidades_minimas) ? true : false,
proximoPedido = (m.miTablaConfig.pedido_minimo - m.totalUnidades),
prevision = calcularPrevision(m.totalUnidades)
}).ToList();
Podemos comparar las expresiones generadas y el tiempo de ejecución según el contexto.