Bonjour,

j'aurai besoin de votre aide. En effet, je rencontre un problème de performance lorsque je construit une large liste d'objet. Au niveau de la récupération des données depuis la base de données c'est rapide mais lorsque je construit ma liste cela deviens extrêmement long. Selon le nombre d'enregistrement que je peux récupérer, cela peux aller jusque 300K records. Je vous laisse imaginer ... Je me suis dit pour tester je vais limiter à 5k records mais cela dure : Temps execution :00:03:18.9387725 minutes

Pour info : l'accès DB se fait avec Entity Framework.

Voici le code :

Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public static List<DisplayRecherche> ChercheById(long id, string operateur)
        {
            DateTime date = DateTime.Now;
            IQueryable<DODON00> query = null;
            List<DODON00> results = null;
 
            switch (operateur)
            {
                case "=":
                    query = ctx.DODON00.Where(x => x.DONSEQ == id);
                    break;
                case "<>":
                    query = ctx.DODON00.Where(x => x.DONSEQ != id);
                    break;
                case "<":
                    query = ctx.DODON00.Where(x => x.DONSEQ < id);
                    break;
                case "<=":
                    query = ctx.DODON00.Where(x => x.DONSEQ <= id);
                    break;
                case ">":
                    query = ctx.DODON00.Where(x => x.DONSEQ > id);
                    break;
                case ">=":
                    query = ctx.DODON00.Where(x => x.DONSEQ >= id);
                    break;
            }
            results = query.Take(5000).ToList();
            List<DisplayRecherche> recherche = results.Select(x => new DisplayRecherche()
            {
                DONENT = GetDatetimeFromDONENT(x.DONENT),
                DONPRD = x.DONPRD,
                DONSEQ = x.DONSEQ,
                LIBLIB = GetLIBLIB(x.DONSEQ)
            }).ToList();
 
            TimeSpan tempExec = DateTime.Now - date;
            Debug.WriteLine("Temps execution :" + tempExec.ToString());
            return recherche;
        }
 
        public static string GetLIBLIB(decimal id)
        {
            string cle = id.ToString("0000000000");
            return ctx.PALIB00.SingleOrDefault(x => x.LIBCLE.Equals(cle)).LIBLIB;
        }
 
        private static DateTime GetDatetimeFromDONENT(decimal donent)
        {
            return new DateTime((int)(donent / 10000), (int)((donent / 100) % 100), (int)(donent % 100));
        }

De ce que j'ai pu comprendre c'est vraiment cette partie qui prend un temps fou ...
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
List<DisplayRecherche> recherche = results.Select(x => new DisplayRecherche()
            {
                DONENT = GetDatetimeFromDONENT(x.DONENT),
                DONPRD = x.DONPRD,
                DONSEQ = x.DONSEQ,
                LIBLIB = GetLIBLIB(x.DONSEQ)
            }).ToList();

Mon code est loin d'être parfait, mais je ne vois pas comment optimiser pour que cela soit plus rapide que 3 minutes pour charger 5k record dans une liste ... Surtout si j'en ai les 300k.