bonjour tout le monde,
je trouve mon linq très lent mais je pense qu'il y a moyen de l'optimisé, pourriez vous me donnez un petit coup de main ou des pistes svp
tout d'abord, j'ai comme base une liste complète de radiateur comprenant marque, modèle, gamme, type que je dois filtrer en fonction de marque, modele et gamme ensuite, j'ai 3 autres critères , puissance, hauteur min et longueur maxi,
en gros si ma longueur ou hauteur ou puissance = 0, je prend la liste complète sinon j'applique des filtres en fonction des critères.
en gros, j'enchaine les where :
Dans mon ObservableCollection, j'ai besoin de la référence, du type, de la hauteur, de la longueur, de la puissance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public bool IsLongueurMaxi(double i) => LongueurMaxi >= i; public bool IsHauteurMin(double i) => HauteurMin <= i; public bool IsPuissance(double i) => Puissance <= i; ListeRadiateur.AddRange(ListCompleteRadiateur.AsParallel() .Where(x => x.Marque == SelectedMarque && x.Modele == SelectedModele && x.Gamme == SelectedGamme) .Where(x => LongueurMaxi == 0 || IsLongueurMaxi(double.Parse(x.Longueur, System.Globalization.CultureInfo.InvariantCulture))) .Where(x => HauteurMin == 0 || IsHauteurMin(double.Parse(x.Hauteur, System.Globalization.CultureInfo.InvariantCulture))) .Where(x => Puissance == 0 || IsPuissance(double.Parse(x.PElec, System.Globalization.CultureInfo.InvariantCulture))) .OrderBy(x => double.Parse(x.Puissance, System.Globalization.CultureInfo.InvariantCulture)) .Select(x => x));
du coup ma requête est lente ma liste compte près de 45 000 lignes du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="450" Type="10S" P50="185" Pente="1.297" Volume="0.99" Poids="3.51" Reference="10S40 0450" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="600" Type="10S" P50="246" Pente="1.297" Volume="1.32" Poids="4.68" Reference="10S40 0600" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="700" Type="10S" P50="287" Pente="1.297" Volume="1.54" Poids="5.46" Reference="10S40 0700" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="800" Type="10S" P50="328" Pente="1.297" Volume="1.76" Poids="6.24" Reference="10S40 0800" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="900" Type="10S" P50="369" Pente="1.297" Volume="1.98" Poids="7.02" Reference="10S40 0900" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="1000" Type="10S" P50="410" Pente="1.297" Volume="2.2" Poids="7.8" Reference="10S40 1000" SS="false" Energie="Eau Chaude"/> <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Compact" Hauteur="300" Longueur="450" Type="21H" P50="336" Pente="1.362" Volume="1.44" Poids="6.48" Reference="21H30 0450" SS="false" Energie="Eau Chaude"/>
Partager