Bonjour @ tous,

Je fait une requête sur une grosse table SQL SERVER (320 000 enregistrements) avec pas mal de relations.
Certes, la requête prend un peu de temps à exécuter, mais ce qui me chagrine, c'est que le le temps de chargement de mes objets est plus longue encore...

J'aimerais savoir si vous voyez une faille dans ma façon de faire.
En gros, j'ai une collection par type d'objet et pour chaque dépendances, je cherche dans la collection ad hoc s'il existe déjà. Si non, il l'ajoute.

Exemple pour charger des articles :
J'ai un objet tblArticle et un objet tblArticles qui contient principalement une collection (BindingList) de tblArticle.
Code : 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
 
Public Class tblArticles
    <DataMember>
    Public items As BindingList(Of tblArticle)
 
    Public Sub GetAll()
        Dim sb As StringBuilder = New StringBuilder($"Debut({DateTime.Now:mm:ss}) ")
        Dim dr As IDataReader
        Dim Fabs As tblFabricants = New tblFabricants(_Env)
 
        dr = _Env.OpenDr("SELECT * FROM ...")
        items.Clear()
	sb.Append($"SqlExec({DateTime.Now:mm:ss}) ")
        While dr.Read
            items.Add(New tblArticle(_Env) With {
                .Id = dr("ID").ToString().Trim(),
                .Desc = dr("DES").ToString().Trim,
                .Fab = Fabs.GetById(New tblFabricant(_Env) With {.Id = dr("FABID").ToString()})
                ...etc...
                })
        End While
        dr.Close() : dr.Dispose() : dr = Nothing
	sb.Append($"Fin({DateTime.Now:mm:ss}, {items.Count} elmts).")
	msgErr = sb.ToString()
    End Sub
End Class
 
Dans ma classe tblFabricants :
    ''' <summary>Retourne l'élément correspondant de la collection. S'il ne le trouve pas, il l'ajoute à la collection.</summary>
    Public Function GetById(o As tblFabricant) As tblFabricant
        If (String.IsNullOrEmpty(o.Id)) Then Return Nothing
        Dim elmt As tblFabricant= items.Where(Function(s) s.Equals(o)).SingleOrDefault()
        If (elmt Is Nothing) Then
                elmt = o
                items.Add(elmt)
            End If
        End If
        Return elmt
    End Function
 
Dans ma classe tblFabricant:
    Public Overrides Function Equals(obj As Object) As Boolean
        Return ((Not obj Is Nothing) AndAlso (TypeOf (obj) Is tblFabricant) AndAlso (CType(obj, tblFabricant).Id = Id))
    End Function
J'ai simplifié le code, il y a plus de GetById que ça (7 en tout), mais le principe est là.
Pour info, le log: Debut(15:49) SqlExec(15:53) Fin(16:18, 362113 elmts).

Est ce que faire du LINQ sur des listes annexes dans chaque boucle est optimisé (sinon, comment faire ?) ?
Est ce que le fait d'utiliser une BindingList pour faire une collection est optimisé (je l'ai fait pour éviter des casts) ?

[EDIT]
J'ai ôté tous mes GetById pour faire directement du New... et en gros, ça ne change pas grand chose: Debut(20:33) SqlExec(20:37) Fin(20:55, 362113 elmts).
18 secondes au lieu de 25, c'est toujours ça de prit, mais 18 c'est toujours énorme et ça me casse pas mal d'automatismes...
[/EDIT]

Merci d'avance.