Je souhaite afficher l'historique comptable d'un client dans un fichier DataGridView
et je veux avoir une colonne qui affiche le total courant de leur solde. L'ancienne façon de procéder consistait à récupérer les données, à les parcourir en boucle et à ajouter des lignes au fichier DataGridView
un par un et de calculer le total courant à ce moment-là. C'est nul. Je préférerais de loin utiliser LINQ to SQL, ou LINQ si ce n'est pas possible avec LINQ to SQL, pour calculer les totaux courants afin que je puisse simplement mettre DataGridView.DataSource
à mes données.
Voici un exemple super-simplifié de ce que je cherche à obtenir. Disons 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 une déclaration L2S, ou LINQ, qui pourrait générer des résultats ressemblant à 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
Notez 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 que les totaux courants ne soient calculés. Je suppose que cela signifie que j'aurai besoin de deux instructions, une pour obtenir les données et les trier et une seconde pour effectuer le calcul du total courant.
J'espérais Aggregate
ferait l'affaire, mais ça ne fonctionne pas comme je l'espérais. Ou peut-être que je n'ai pas réussi à le comprendre.
Ce site question semblait viser la même chose que moi, mais je ne vois pas comment la réponse acceptée/unique résout mon problème.
Des idées sur la façon d'y parvenir ?
Modifier En combinant les réponses d'Alex et de DOK, voici ce à quoi j'ai abouti :
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
0 votes
Merci pour ce nouvel outil ! : RunningTotal = runningTotal += item.Amount
0 votes
Cette solution ne va-t-elle pas forcer l'exécution sur le client ? (c.-à-d. qu'il doit extraire l'ensemble des résultats pour obtenir la bonne réponse) -- il semble que quelque chose comme cela serait beaucoup plus performant si cela était fait sur le serveur SQL...
2 votes
L'utilisation d'une variable externe à la requête est très dangereuse ! Parce que
results
La variable est deIEnumerable
type, son l'exécution sera différée jusqu'à plus tard. Si vous modifiez la valeur derunningTotal
avant cela, la requête résultante ne sera plus correcte. Pour être sûr, vous devez l'énumérer immédiatement (en liste ou en tableau). Je ne vois pas ce qu'il y a de mal à utiliser un simpleforeach
boucle.0 votes
EXACTEMENT le problème que j'essayais de résoudre. Merci d'avoir posé cette question il y a six ans !