Quiero mostrar el historial contable de un cliente en un DataGridView
y quiero tener una columna que muestre el total acumulado de su saldo. La forma antigua en que lo hice fue obtener los datos, recorrer los datos y agregar filas al DataGridView
uno a uno y calcular el total acumulado en ese momento. Cojo. Prefiero usar LINQ to SQL, o LINQ si no es posible con LINQ to SQL, para calcular los totales acumulados, así que puedo simplemente configurar DataGridView.DataSource
en mis datos.LINQ to SQL y un total acumulado de resultados ordenados
Este es un ejemplo súper simplificado de lo que estoy rodando. Digamos que tengo la siguiente clase.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Me gustaría tener un L2S, o LINQ, indicación de que podría generar resultados que se ven así:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
Tenga en cuenta que puede haber múltiples elementos con la misma fecha (12-02-2009) Los resultados deben ordenarse por fecha antes de calcular los totales acumulados. Supongo que esto significa que necesitaré dos declaraciones, una para obtener los datos y ordenarlos, y otra para realizar el cálculo del total acumulado.
Esperaba que Aggregate
hiciera el truco, pero no funciona como esperaba. O tal vez simplemente no pude resolverlo.
Este question parecía estar yendo después de lo mismo que yo quería, pero no veo cómo la respuesta aceptada/única resuelve mi problema.
¿Alguna idea sobre cómo llevarlo a cabo?
Editar Peinar las respuestas de Alex y DOK, esto es lo que terminó con:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
Gracias por la nueva herramienta! : RunningTotal = runningTotal + = item.Amount –
¿Esta solución no obligará a la ejecución a estar en el cliente? (es decir, tiene que desplegar todo el conjunto de resultados para obtener la respuesta correcta?) - parece que algo así sería mucho más eficaz si se realizara en el servidor SQL ... – BrainSlugs83
Usando una variable externa a la consulta ¡es muy peligroso! Como la variable 'results' es del tipo' IEnumerable', su ** ejecución se aplazará ** hasta más tarde. Si cambia el valor de 'runningTotal' antes de eso, su consulta resultante ya no será correcta. Para estar seguro necesita enumerarlo de inmediato (para listar o ordenar). No veo nada malo aquí con el uso de un simple bucle 'foreach'. – Alexey