Linq avec plusieurs resultats de somme (SUM)

Résolu
obxsolo Messages postés 3 Date d'inscription dimanche 17 décembre 2017 Statut Membre Dernière intervention 17 décembre 2017 - 17 déc. 2017 à 10:07
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 17 déc. 2017 à 14:34
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

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
17 déc. 2017 à 11:18
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();


1
obxsolo Messages postés 3 Date d'inscription dimanche 17 décembre 2017 Statut Membre Dernière intervention 17 décembre 2017
17 déc. 2017 à 12:53
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)}
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
17 déc. 2017 à 13:17
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()

0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
17 déc. 2017 à 13:24
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.
0
obxsolo Messages postés 3 Date d'inscription dimanche 17 décembre 2017 Statut Membre Dernière intervention 17 décembre 2017
17 déc. 2017 à 14:32
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.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
17 déc. 2017 à 14:34
De rien, pense à mettre le sujet résolu si cela te convient.
0
Rejoignez-nous