Je suis nouveau à ADO.net et ont ce problème:Comment revenir aussi peu que possible les lignes de la table liée
Supposons que j'ai ces deux tables dans une base de données SQL Server 2005, avec ces colonnes:
[commandes]
- OrderID
- OrderDate
- ShopID
- TotalAmoun t
- TotalTaxAmount
- etc ...
[OrdersDetails]
- OrderID
- ShopID
- ItemID
- Quantité
- Montant
- TaxAmount
- etc
J'ai commencé une application WinForms pour me commencer. Dans ce formulaire, l'utilisateur peut sélectionner une liste de magasins et sélectionner une plage de dates pour voir toutes les commandes de ce magasin.
J'ai ajouté une source de données à partir de Visual Studio, sélectionnez la table Orders et OrdersDetails et glissé et déposé les commandes et les tables OrdersDetails connexes dans le formulaire en tant que DataGridViews.
Lorsque je sélectionne une ligne à partir de la commande DataGridView, je vois effectivement les détails des commandes correspondantes dans le second DataGridView comme je le voulais. J'avais des relations à l'intérieur de cette base de données et ADO.net les a saisies et les a reflétées dans l'ensemble de données.
J'ai ensuite ajouté une méthode à mon jeu de données typé pour obtenir des données par les colonnes OrderDate et ShopID. Comme la table OrdersDetails n'a pas de colonne OrderDate, je n'ai pu la filtrer que par ShopID. Le problème est qu'il prend beaucoup de temps pour obtenir les enregistrements de OrdersDetails car il récupérera plus de lignes que nécessaire dans le DataTable pour OrdersDetails. Le problème est que je ne peux filtrer que les lignes de la table OrderDetails par ShopID, ce qui renvoie beaucoup trop d'enregistrements de la base de données.
De toute évidence, ADO.net est capable de les filtrer de manière appropriée sur le client en utilisant la relation OrderID, mais il serait beaucoup plus logique de récupérer uniquement les lignes de OrdersDetails dont j'ai réellement besoin. J'ai modifié mes requêtes en obtenant les données de la deuxième table pour ajouter le OrderDate en utilisant une jointure, ainsi je peux filtrer par date quand je récupère les données de la base de données ... cependant, cela pose des problèmes quand j'essaye de mettre à jour mes changements dus à cette colonne étrangère ...
Je crois qu'il doit y avoir un moyen facile de contourner ce problème, n'est-ce pas?
Merci beaucoup d'avance.
'OERE OrderID IN (SELECT ...)' peut facilement être converti en une jointure, ce qui serait beaucoup plus efficace. –
@Winston Smith: il pourrait facilement être écrit comme une jointure interne, oui. en fait, c'est ainsi que le serveur sql fusionnera les résultats d'un select comme celui-ci. il utilisera les mêmes statistiques, élaborera le même plan d'exécution et fonctionnera aussi bien (puisqu'il fait exactement la même chose) dans les deux solutions. –
Merci beaucoup. En fait, j'ai fait une jointure avant comme je l'ai dit dans la question, mais mon problème était que j'ai ajouté cette colonne à la table retournée qui a causé les problèmes avec les mises à jour. Votre réponse m'a fait réaliser mon erreur. Merci. –