obxsolo
Messages postés3Date d'inscriptiondimanche 17 décembre 2017StatutMembreDernière intervention17 décembre 2017
-
17 déc. 2017 à 10:07
Whismeril
Messages postés19144Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 8 septembre 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
Whismeril
Messages postés19144Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 8 septembre 2024660 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();
obxsolo
Messages postés3Date d'inscriptiondimanche 17 décembre 2017StatutMembreDernière intervention17 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)}
Whismeril
Messages postés19144Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 8 septembre 2024660 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()
Whismeril
Messages postés19144Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 8 septembre 2024660 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
Messages postés3Date d'inscriptiondimanche 17 décembre 2017StatutMembreDernière intervention17 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.
Whismeril
Messages postés19144Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 8 septembre 2024660 17 déc. 2017 à 14:34
De rien, pense à mettre le sujet résolu si cela te convient.
17 déc. 2017 à 12:53