Linq avec plusieurs resultats de somme (SUM) [Résolu]

Signaler
Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
Statut
Membre
Dernière intervention
17 décembre 2017
-
Messages postés
15920
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
-
Bonjour, pour mon logiciel j'utilise une .dll qui me sert de relais avec la base donnée, le logiciel interroge la .dll pour avoir des listes, des objets etc... le log ne connait pas la base. je dois effectuer des calculs assez importants (de 50 à 100 000 lignes) par exemple des sum, pour l'instant j'extrais des listes des ces rows et j'effectue des totaux dessus mais même sur un pc véloce ça rame. (surchage ram pourtant j'ai 16Go, le modèle est bien plus complexe que l'exemple, il me faut aussi des moyennes, des incréments, des renvois sur d'autres tables etc)
exemple simple :
Name Val1 Val2 Val3
row1 200 29 145
row2 187 36 168
row3 789 123 456
...
row100000 876 452 236

j'ai besoin de Total.Val1, Total.Val2, Total.Val3 ?

je voudrais faire une requête linq qui me permettrais dans un object anonyme ou typé de me renvoyer les 3 totaux en un seul parcours de la base, je pense que ça gagnerait du temps par rapport à 3 requêtes. Merci

2 réponses

Messages postés
15920
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Bonjour

soit la classe
    class obxsolo
    {
        public string Nom { get; set; }

        public int Val1 { get; set; }

        public int Val2 { get; set; }

        public int Val3 { get; set; }
    }


Code exempel avec une liste
           List<obxsolo> lesDonnees = new List<obxsolo>
            {
                new obxsolo{Nom= "row1", Val1= 200,Val2= 29,Val3= 145 },
                new obxsolo{Nom= "row2", Val1= 187,Val2= 36,Val3= 168 },
                new obxsolo{Nom= "row3", Val1= 789,Val2= 123,Val3= 456 },
                new obxsolo{Nom= "row100000", Val1= 876,Val2= 452,Val3= 236 }

            };


            obxsolo somme = (from o in lesDonnees
                             group o by 1 into g
                             select new obxsolo
                             {
                                 Nom = "Total",
                                 Val1 = g.Sum(x => x.Val1),
                                 Val2 = g.Sum(x => x.Val2),
                                 Val3 = g.Sum(x => x.Val3)
                             }
                             ).First();


Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
Statut
Membre
Dernière intervention
17 décembre 2017

merci Whismeril de votre aide, mais j'ai posté trop vite en C#, ma dll est en VB et juste le group à by 1 pose problème en VB, mais en passant en dur les 3 "val" ça a l'air de fonctionner ! merci encore !

Dim a As obxsolo= From o In ctx.maTable
 Where o.Id >= Interv.Premier And o.Id <= Interv.Dernier
                                  Group By o.val1, o.Val2, o.Val3 Into Group
                                  Select New obxsolo With {
                         .tot1 = Group.Sum(Function(p) p.Val1),
                         .tot2 = Group.Sum(Function(r) r.Val2),
                         .tot3 = Group.Sum(Function(x) x.Val3)}
Messages postés
15920
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Si ça marche aussi
        Dim somme As obxsolo = (
                From o In lesDonnees
                Group o By GroupKey = 1 Into g = Group
                Select New obxsolo With
                    {
                        .Nom = "Total",
                        .Val1 = g.Sum(Function(x) x.Val1),
                        .Val2 = g.Sum(Function(x) x.Val2),
                        .Val3 = g.Sum(Function(x) x.Val3)
                    }
                    ).First()

Messages postés
15920
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Ha le 1er commentaire de la meilleure réponse de ce fill précise que s'il n'y a pas d'identifiant uniques alors il faut grouper par l'instance.
Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
Statut
Membre
Dernière intervention
17 décembre 2017

oui en en effet j'avais un faux positif car je n'avais pas recompilé ma dll, mon code donnait une erreur, mais après seconde modif grâce au GroupKey ça fonctionne impec.
En fait je fais des requêtes depuis un moment, mais j'avais jamais eu cette configuration là en linq et je ne savais pas comment grouper ses Sum sans rapport réel. là c'est sûr ça marche bien, les 3 totaux passent dans l'objet. je vais pouvoir traiter ça ! merci encore pour le temps passé à résoudre mon problème.
Messages postés
15920
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
De rien, pense à mettre le sujet résolu si cela te convient.