Desidero visualizzare la cronologia di un cliente in un DataGridView
e voglio avere una colonna che visualizza il totale parziale per il loro saldo. Il modo in cui l'ho fatto è stato ottenere i dati, eseguire il looping dei dati e aggiungere righe allo DataGridView
uno alla volta e calcolare il totale parziale in quel momento. Noioso. Preferirei usare LINQ to SQL, o LINQ se non possibile con LINQ to SQL, per calcolare i totali correnti così posso solo impostare DataGridView.DataSource
sui miei dati.LINQ a SQL e un totale parziale sui risultati ordinati
Questo è un esempio semplicissimo di quello per cui sto girando. Dì che ho la seguente classe.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Vorrei una L2S o LINQ, dichiarazione che potrebbe generare risultati che assomigliano a questo:
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
Si noti che non ci può essere più elementi con la stessa data (12-02-2009). I risultati dovrebbero essere ordinati per data prima del calcolo dei totali correnti. Sto indovinando questo significa che ho bisogno di due dichiarazioni, una per ottenere i dati e ordinarli e un secondo per eseguire il calcolo totale parziale.
Speravo che il Aggregate
facesse il trucco, ma non funziona come speravo. O forse non riuscivo a capirlo.
Questo question sembrava cercare la stessa cosa che volevo, ma non vedo come la risposta accettata/unica risolva il mio problema.
Qualche idea su come estrarre questo?
Modifica Pettinatura le risposte da Alex e DOK, questo è ciò che ho finito 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
});
Grazie per il nuovo strumento! : RunningTotal = runningTotal + = item.Amount –
Questa soluzione non impone l'esecuzione forzata sul client? (cioè deve tirare giù l'intero set di risultati per ottenere la risposta corretta?) - sembra che qualcosa del genere sarebbe molto più performante se fosse eseguita sul server SQL ... – BrainSlugs83
Uso di una variabile esterna alla query è molto pericoloso! Poiché la variabile 'results' è di tipo' IEnumerable', la sua ** esecuzione sarà differita ** fino a tardi. Se cambi il valore di 'runningTotal' prima di quello, la tua query risultante non sarà più corretta. Per sicurezza, è necessario enumerarlo immediatamente (per elencare o array). Qui non vedo nulla di sbagliato nell'usare un semplice ciclo 'foreach'. – Alexey