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

obxsolo 3 Messages postés dimanche 17 décembre 2017Date d'inscription 17 décembre 2017 Dernière intervention - 17 déc. 2017 à 10:07 - Dernière réponse : Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention
- 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 

6 réponses

Répondre au sujet
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 17 déc. 2017 à 11:18
+1
Utile
1
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();


obxsolo 3 Messages postés dimanche 17 décembre 2017Date d'inscription 17 décembre 2017 Dernière intervention - 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)}
Commenter la réponse de Whismeril
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 17 déc. 2017 à 13:17
0
Utile
3
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 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 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.
obxsolo 3 Messages postés dimanche 17 décembre 2017Date d'inscription 17 décembre 2017 Dernière intervention - 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.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 17 déc. 2017 à 14:34
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.