Je souhaite afficher l'historique comptable d'un client dans un DataGridView
et je souhaite avoir une colonne affichant le total cumulé de leur solde. L'ancienne façon de procéder consistait à obtenir les données, à faire défiler les données et à ajouter des lignes au fichier DataGridView
et à calculer le total cumulé à ce moment-là. Boiteux. Je préférerais utiliser LINQ to SQL, ou LINQ si ce n'est pas possible avec LINQ to SQL, pour calculer les totaux cumulés, donc je peux simplement mettre DataGridView.DataSource
à mes données.LINQ to SQL et un total cumulé sur les résultats commandés
Ceci est un exemple super simplifié de ce que je photographie. Dites que j'ai la classe suivante.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Je voudrais un L2S ou LINQ, déclaration qui pourrait générer des résultats qui ressemblent à ceci:
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
avis qu'il peut y avoir plusieurs éléments avec la même date (12-02-2009). Les résultats doivent être triés par date avant le calcul des totaux cumulés. Je suppose que cela signifie que j'ai besoin de deux instructions, l'une pour obtenir les données et le trier et une seconde pour effectuer le calcul du total cumulé.
J'espérais que Aggregate
ferait l'affaire, mais cela ne fonctionne pas comme j'espérais. Ou peut-être que je ne pouvais tout simplement pas comprendre.
Ce question semblait aller après la même chose que je voulais, mais je ne vois pas comment la réponse acceptée/seule résout mon problème.
Des idées pour réussir?
Modifier peigner les réponses de Alex et DOK, voilà ce que j'ai fini avec:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
Merci pour le nouvel outil! : RunningTotal = runningTotal + = item.Amount –
Cette solution ne forcera-t-elle pas l'exécution à être sur le client? (c'est-à-dire qu'il doit dérouler tout le jeu de résultats pour obtenir la bonne réponse?) - il semble que quelque chose comme cela serait beaucoup plus performant s'il était fait sur le serveur SQL ... – BrainSlugs83
Utilisation d'une variable externe à la requête est très dangereux! Parce que la variable 'results' est de type' IEnumerable', son exécution ** sera différée ** jusqu'à plus tard. Si vous changez la valeur de 'runningTotal' avant cela, votre requête résultante ne sera plus correcte. Pour être sûr, vous devez l'énumérer immédiatement (à la liste ou tableau). Je ne vois rien de mal ici à l'aide d'une simple boucle foreach. – Alexey