11 votes

Utiliser LINQ pour regrouper les données de DataTable

Je veux utiliser LINQ pour regrouper les données d'une DataTable (colonnes : userid, chargetag, charge).

Le contenu pourrait ressembler à ceci :

userid    chargetag    charge
-----------------------------
user1     tag3         100
user2     tag3         100
user3     tag5         250

J'ai besoin de quelque chose comme ça comme résultat :

chargetag    count    sum
-------------------------
tag3         2        200
tag5         1        250

Voici ce que j'ai jusqu'à présent :

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let count = g.Count()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = count,
                  };

Je peux extraire le nom du chargetag et son numéro. Comment devrais-je modifier la requête LINQ pour accéder également à la somme des charges ?

Merci d'avance :-)

Regards, Kevin

44voto

Jon Skeet Points 692016

C'est assez facile - il suffit d'utiliser la fonction Sum méthode d'extension sur le groupe.

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = g.Count(),
                      ChargeSum = g.Sum(x => x.Field<int>("charge"))
                  };

(J'ai enlevé le let clause ici car elle ne vous permettait pas vraiment d'acheter quelque chose).

Maintenant que mai est inefficace ; il peut finir par regrouper deux fois afin d'effectuer deux opérations d'agrégation. Vous pouvez consulter le site podría réparer cela avec une suite de requêtes comme celle-ci, si vous le vouliez vraiment :

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      List = g.ToList(),
                  } into g
                  select new 
                  {
                      g.ChargeTag,
                      Count = g.List.Count,
                      ChargeSum = g.List.Sum(x => x.Field<int>("charge"))
                  };

Ou avec un let à la place :

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let list = g.ToList()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = list.Count,
                      ChargeSum = list.Sum(x => x.Field<int>("charge"))
                  };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X