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
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);
}
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.

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!