Bonjour à tous, je ne sais pas si mon titre est clair, mais je vais détailler ici.
Il m'arrive souvent d'avoir à faire des requêtes entre plusieurs tables dans le but de générer un rapport par exemple.
Pour faire simple, je vais y aller avec deux tables.
Table Facture
int Id_Facture string Nom_Client string Téléphone Date Date_Facture
Table Facture_Detail
int Id_Facture_Detail int Id_Facture int Quantite string Description decimal Prix
J'aimerais générer une liste de facture pour une journée en particulier. Ce que je fais présentement,
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 List<Facture> factures = new List<Facture>(); OleDbCommand command = new OleDbCommand(@"select Id_Facture, Nom_Client, Téléphone, Date_Facture from Facture where Date_Facture = @dateFacture", connection); command.Parameters.AddWithValue("@dateFacture", dateFacture); OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { factures.Add(new Facture(reader.GetInt32(0), reader.GetString(1), reader.GetString(2), reader.GetDateTime(3))); } foreach (Facture f in factures) { command = new OleDbCommand(@"select Id_Facture_Detail, Id_Facture, Quantite, Description, Prix from Facture_Detail where Id_Facture = @idFacture", connection); command.Parameters.AddWithValue("@idFacture", f.Id_Facture); reader = command.ExecuteReader(); while (reader.Read()) { f.FactureDetails.Add(new FactureDetail(reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetString(3), reader.GetDecimal(4))); } }
Il y a possiblement des erreurs de syntaxe, là n'est pas l'important. Ce que je me demande, c'est s'il y a moyen de faire autrement que de faire N différentes requêtes SQL obtenir tous les détails de toutes mes factures. Si j'en ai 100, cela me fait 101 requêtes à exécuter au total.
J'avais déjà essayé de joindre mes deux tables, mais je devais faire pleins de vérifications en C# afin de bien «trier» les Facture_Détail dans la bonne facture, ce qui était au final très lourd pour le système si j'ai beaucoup d'éléments à afficher.
Quelque chose comme
Bref, je trouve ça inutilement lourd, et je me dis qu'il y a sûrement un meilleur moyen d'obtenir ce que je veux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Facture factureTemp = Factures.Find(x=>x.IdFacture); if(factureTemp != null) { FactureDetail factureDetailTemp = factureTemp.FactureDetail.Find(x=>x.IdFactureDetail); }
Vous, vous procédez comment pour exécuter une telle requête? Prendre en considération qu'il peut y avoir des centaines de requêtes à exécuter, ce qui peut être plutôt lourd.
Merci et bonne journée!
Partager