La meilleure façon de construire des requêtes sql en C#/.NET3.5?
Un projet sur lequel je travaille en ce moment implique de refactoring a C# de l'Objet Com qui sert comme une base de données de la couche d'accès à certaines bases de données Sql 2005.
L'auteur du code existant a construit toutes les requêtes sql manuellement à l'aide d'une ficelle et beaucoup de si-états pour construire le assez complexe instruction sql (~10 jointures, >10 sous sélectionne, ~15-25 où les conditions de travail et de Groupe). La table de base est toujours la même, mais la structure de jointures, les conditions et les groupements dépendent d'un ensemble de paramètres qui sont passés dans ma classe/méthode.
De la construction de la requête sql comme ceci fonctionne, mais il n'est évidemment pas très élégante, une solution (et plutôt difficile à lire/comprendre et à maintenir ainsi)... je pourrais juste écrire un simple "querybuilder" moi-même mais je suis assez sûr que je ne suis pas le premier, avec ce genre de problème, d'où mes questions:
- Comment vous construire vos requêtes de base de données?
- Ne C# offre un moyen facile de créer dynamiquement des requêtes?
OriginalL'auteur Ben | 2008-09-15
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé le C# et Linq pour faire quelque chose de similaire pour obtenir des entrées de journal filtré sur la saisie de l'utilisateur (voir Conditionnel Requêtes Linq):
Edit: La requête n'est pas exécutée jusqu'à ce que .ToList() dans le dernier rapport.
Le IQueryable<Log> est converti en SQL dans la dernière ligne, où la requête est exécuté; tous Où LINQ déclarations deviennent une clause SQL where. C'est la façon dont je le fais très variable SQL. C'est beaucoup plus propre que d'essayer d'écrire une procédure stockée pour le faire.
Merci pour l'explication.
Je pense que c'est ce que je cherchais... Merci!
OriginalL'auteur sgwill
Sauf executiontime est vraiment important, je considère le refactoring, la logique métier qui (souvent) tend à trouver son chemin vers le bas pour le datalayer et en gazillion au long de la stockées procs. En termes de maintainabillity, editabillity et appendabillity j'essaie toujours d' (comme le programmeur C# je suis), la levée de code jusqu'à la businesslayer.
Essayé de trier de quelqu'un elses 8000 ligne de SQL Script n'est pas mon préféré de la tâche.
🙂
//W
OriginalL'auteur Wiren
LINQ est le chemin à parcourir.
OriginalL'auteur Vinko Vrsalovic
C'est la façon dont je le ferais:
La Expression paramètre passé sera la requête dynamique, vous aurez à construire avec les différents OÙ l'une des clauses, les JOINTURES, etc. Cette Expression obtiendrez Invoquée au moment de l'exécution et de vous donner ce dont vous avez besoin.
Voici un exemple de comment l'appeler:
OriginalL'auteur Esteban Araya
Sa vaut la peine d'examiner si vous pouvez mettre en œuvre en tant que de paramétrer strored procédure et l'optimiser dans la base de données plutôt que de les générer dynamiquement le SQL via LINQ ou un ORM au moment de l'exécution. Souvent, cela fonctionnera mieux. Je sais que je suis un peu vieux jeu, mais parfois, c'est l'approche la plus efficace.
OriginalL'auteur rhys
Je comprends le potentiel de Linq mais je n'ai pas encore vu quelqu'un essayer de le faire d'une requête Linq de la complexité que Ben est ce qui suggère
Quelqu'un aurait-il des exemples de grandes requêtes Linq, et tout commentaire sur leur facilité de gestion?
OriginalL'auteur Darrel Miller
Linq to SQL avec le Système.Linq.Dynamique apporte quelques belles possibilités.
J'ai posté quelques exemples d'extraits de code ici:
http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq
...et ici:
http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/717004553931?r=777003863931#777003863931
OriginalL'auteur KristoferA
Je suis venue à cette fin et n'ont aucune chance pour un upvote, mais il y a une solution que je n'ai pas vu considérées: Une combinaison de la fonction/procédure avec linq-to-objet. Ou xml ou datatable, je suppose.
J'ai été dans cette situation exacte, avec un énorme construite dynamiquement la requête qui a été kindof une réalisation impressionnante, mais la complexité de ce qui fait pour un entretien cauchemar. J'ai eu beaucoup de vert des commentaires pour aider les pauvres sap qui devait venir plus tard et de les comprendre. J'ai été en asp classique, donc j'ai eu quelques solutions de rechange.
Ce que j'ai fait depuis, c'est une combinaison de fonction/procédure et linq. Souvent les total de la complexité est inférieure à la complexité d'essayer de le faire d'un seul endroit. Transmettre une partie de vos critères de l'UDF, qui devient beaucoup plus facile à gérer. Cela vous donne un niveau raisonnable et compréhensible. Appliquer vos autres distinctions à l'aide de linq.
Vous pouvez utiliser les avantages des deux:
possible sur le serveur; nombre de
fou rejoint pris en charge sur le
serveur. Les bases de données sont bonne à ce
des trucs.
Comment déterminer les critères à gérer dans la db et qui, avec linq? Utilisez votre jugement. Si vous pouvez gérer efficacement complexe requêtes db, vous pouvez gérer cela. Une partie de l'art, la science de la partie.
Oui, il y a une énorme quantité de facteurs ici, et nous tous, nous permettrait de donner plus de conseils ciblés si nous avions plus de détails. Pour un complexe moteur de recherche, je suis en train de faire un bonne estimation sur la base de mon expérience, c'est tout et maintenance. L'utilisation de la dynamique dans KristoferA exemples peuvent avoir un rendement de pénalité qui l'emporte sur sa souplesse. Linq to générique enumerables offre simplicité, à un coût acceptable, tant que certains gros du travail est déjà fait. Et avec massivement logique complexe, je n'ai pas confiance Linq-to-sql pour définir la base de données-travailler efficacement. Pas encore de.
OriginalL'auteur Patrick Karcher
Vous pourriez envisager de LINQ ou un O/R Mapper comme celui-ci: http://www.llblgen.com/
OriginalL'auteur Bloodhound
Si à l'aide de C# et de .NET 3.5, avec l'ajout de MS SQL Server puis LINQ to SQL est certainement le chemin à parcourir. Si vous utilisez autre chose que de cette combinaison, je vous recommande un ORM route, comme nHibernate ou Subsonic.
OriginalL'auteur
Il y a une sorte de expérimentale essayez un QueryBuilder classe à http://www.blackbeltcoder.com/Articles/strings/a-sql-querybuilder-class. Peut-être en valeur un regard.
OriginalL'auteur Jonathan Wood
Découvrez http://sqlom.sourceforge.net. Je pense que c'est exactement ce que vous cherchez.
OriginalL'auteur Oleg