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

Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
Dernière intervention
17 décembre 2017
- - Dernière réponse : Whismeril
Messages postés
12384
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
12384
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
1
Merci
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();


Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

obxsolo
Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
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)}
Commenter la réponse de Whismeril
Messages postés
12384
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
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()

Whismeril
Messages postés
12384
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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.
obxsolo
Messages postés
3
Date d'inscription
dimanche 17 décembre 2017
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.
Whismeril
Messages postés
12384
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
De rien, pense à mettre le sujet résolu si cela te convient.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.