75 votes

Obtenir la somme de deux colonnes en une seule requête LINQ

Disons que j'ai une table appelée Articles (ID int, Fait int, Total int)

Je peux le faire par deux requêtes :

int total = m.Items.Sum(p=>p.Total)
int done = m.Items.Sum(p=>p.Done)

Mais j'aimerais le faire en une seule requête, quelque chose comme ça :

var x = from p in m.Items select new { Sum(p.Total), Sum(p.Done)};

Il existe sûrement un moyen d'appeler des fonctions agrégées à partir de la syntaxe LINQ... ?

108voto

Steven Points 56939

Cela fera l'affaire :

from p in m.Items
group p by 1 into g
select new
{
    SumTotal = g.Sum(x => x.Total), 
    SumDone = g.Sum(x => x.Done) 
};

11 votes

Ou lorsque Item n'a pas d'identifiant unique, vous pouvez écrire group p by p into g .

1 votes

Cela a fonctionné, mais avec une modification : from p in m.Items group p by p.Id into g select new { SumTotal = g.Sum(r => r.Total), SumDone = g.Sum(r => r.Done) }

0 votes

@vcRobe : Avez-vous vraiment un problème où la méthode donnée n'est pas adaptée ? Je ne pense pas qu'il y ait un moyen facile de faire cela avec LINQ. Vous devrez probablement effectuer un foreach sur les éléments et stocker les résultats temporaires dans un Dictionary<int, ReturnType>.

11voto

WhoIsNinja Points 1024

Pour résumer le tableau, regroupez par une constante :

from p in m.Items
group p by 1 into g
select new {
    SumTotal = g.Sum(x => x.Total),
    SumDone = g.Sum(x => x.Done)
}

0 votes

Quelqu'un peut-il poster une version vb.net ?

0 votes

@Zeus Voici le code VB.Net, From g In From p In m.ItemsGroup p By 1New With { _ Key .SumTotal = g.Sum(Function(x) x.Total), _ Key .SumDone = g.Sum(Function(x) x.Done) _ } Vous pouvez convertir les codes ici enlace

10voto

Jens Points 14829

Et si

   m.Items.Select(item => new { Total = item.Total, Done = item.Done })
          .Aggregate((t1, t2) => new { Total = t1.Total + t2.Total, Done = t1.Done + t2.Done });

1 votes

Je crois que cela n'est pas compatible avec SQL.

7voto

viejo Points 41

Trouver où extraire les sommes ou autres agrégats dans le reste de mon code m'a déconcerté, jusqu'à ce que je me rappelle que la variable que j'ai construite était un Iqueryable. Supposons que nous ayons une table dans notre base de données composée de commandes, et que nous voulions produire un résumé pour la société ABC :

var myResult = from g in dbcontext.Ordertable
               group p by (p.CUSTNAME == "ABC") into q  // i.e., all of ABC company at once
               select new
{
    tempPrice = q.Sum( x => (x.PRICE ?? 0m) ),  // (?? makes sure we don't get back a nullable)
    tempQty = q.Sum( x => (x.QTY ?? 0m) )
};

Maintenant la partie amusante -- tempPrice et tempQty ne sont déclarés nulle part mais ils doivent faire partie de myResult, non ? Accédez à eux comme suit :

Console.Writeline(string.Format("You ordered {0} for a total price of {1:C}",
                                 myResult.Single().tempQty,
                                 myResult.Single().tempPrice ));

Un certain nombre d'autres méthodes Queryable pourraient également être utilisées.

1voto

Gaushick Points 16
//Calculate the total in list field values
//Use the header file: 

Using System.Linq;
int i = Total.Sum(G => G.First);

//By using LINQ to calculate the total in a list field,

var T = (from t in Total group t by Total into g select g.Sum(t => t.First)).ToList();

//Here Total is a List and First is the one of the integer field in list(Total)

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