2008-09-17 5 views
1

J'ai récemment écrit une application (vb.net) qui stocke et permet de rechercher les anciens plans du conseil. Maintenant que l'application fonctionne bien, l'autre jour, je jetais un coup d'oeil à la routine que j'utilise pour générer la chaîne SQL pour passer la base de données et, franchement, c'était mauvais.
Je posais juste une question ici pour voir si quelqu'un d'autre a une meilleure façon de le faire. Ce que j'ai est un formulaire avec un tas de contrôles allant des zones de texte aux boutons radio, chacun de ces contrôles sont comme des filtres de base de données et quand l'utilisateur touche le bouton de recherche, une chaîne SQL (je voudrais vraiment qu'il soit une requête LINQ parce que j'ai changé en LINQ en SQL) est généré à partir des contrôles terminés et exécuté. Le problème que j'ai est de faire correspondre chacun de ces contrôles à un champ dans la base de données et de générer une requête LINQ efficacement sans faire un tas de "si ... alors ... autrement." déclarations. Dans le passé, je viens d'utiliser la propriété tag du contrôle pour lier le contrôle à un nom de champ dans la base de données.Générer une requête LINQ à partir de plusieurs contrôles

Je suis désolé si c'est un peu déroutant, c'est un peu difficile à décrire. Juste jeter là-bas pour voir si quelqu'un a des idées.

Merci Nathan

Répondre

0

Lorsque vous programmez des requêtes de type requête ad hoc complexes, les attributs peuvent être votre meilleur ami. Adoptez une approche plus déclarative et décorez vos classes, interfaces et/ou propriétés avec certains attributs personnalisés, puis écrivez du code générique "colle" qui lie votre interface utilisateur à votre modèle. Cela permettra à votre modèle et votre présentation d'être flexible, sans avoir à changer 1000 lignes de logique de contrôleur. En fait, c'est exactement la façon dont Microsoft construit la page "Propriétés" de Visual Studio. Vous pouvez même utiliser "EnvDTE.dll" de Microsoft dans votre produit en fonction des besoins.

+1

Seriez-vous capable de me montrer un exemple de code "colle" générique. –

+0

http://www.castleproject.org/ActiveRecord/ – slf

0

Vous pourriez peut-être envelopper chaque contrôle dans un UserControl qui peut prendre en IQueryable et virer de bord à la requête si elle est justifiée.

donc votre code de page peut aller quelque chose comme

var qry = from t in _db.TableName 
     select t; 

puis passer qry à une méthode sur chaque contrôle utilisateur

IQueryable<t> addToQueryIfNeeded(IQueryable<t> qry) 
{ 
    if(should be added) 
     return from t in qry 
      where this == that 
      select t; 
    else 
     return qry 
} 

puis après vous passez par chaque contrôle votre requête serait complète et vous pouvez .ToList(). Une chose cool à propos de LINQ est que rien ne se passe jusqu'à ce que vous .ToList() ou .First() il.

+0

Cela ne me dérange pas cette méthode, mais j'espérais éviter d'écrire un tas de contrôles personnalisés juste pour cela. –

0

Je ne connais pas les performances ici, mais si vous configurez la classe de contexte de données LINQ to SQL, vous devriez pouvoir interroger une table de base de données avec un .Select (...) ou .Where (.. .). Vous devriez être capable de construire des expressions lambda pour l'un ou l'autre dynamiquement. Vous pouvez vous intéresser à la génération dynamique d'expressions lambda à cette fin. J'ai tout fait jusqu'à la génération lambda dynamique, mais c'est possible.

0

Je ne suis pas sûr à 100% comment y parvenir, mais je sais où un bon point de départ serait, dans la source ASP.NET MVC. Dans les versions récentes, il est capable de prendre la réponse de formulaire et de la passer dans une méthode d'assistance qui écrit dans une source de données LINQ. Je crois que MVC est C# donc si vous cherchez une traduction VB, vous pouvez essayer d'utiliser .NET Reflector et le convertir en VB.

0

Je pense que vous cherchez comment créer une requête Linq "Dynamique", Here est un exemple sur la façon de le faire avec une bibliothèque de méthodes d'extension. Ces méthodes prennent des arguments de chaîne au lieu d'opérateurs de langage sécurisés.

0

Cela ne me dérange pas la méthode de sfusco en utilisant des attributs. La seule chose dont je ne suis pas sûr est de savoir où attacher les attributs parce que si je joins à la déclaration des contrôles qui est dans le code du concepteur, il sera régénéré lorsque le formulaire change. Ou est-ce que je me méprends complètement sur les méthodes de sfusco?

0

Je pense peut-être la bonne façon de le faire serait un fournisseur d'extension: MSDN documentation

Ensuite, vous pouvez utiliser l'éditeur de fournir les noms de champ pour raccorder avec, et votre fournisseur d'extension peut être passé un IQueryable < T>, ajoutez les critères et renvoyez un IQueryable < T>.

Questions connexes