2009-02-25 6 views
0

J'utilise actuellement un CMS qui utilise un ORM avec son propre langage de requête sur mesure (c'est-à-dire avec des instructions select/where/orderby). Je me réfère à cette mini-langue comme une DSL, mais je pourrais avoir la mauvaise terminologie.Un DSL pour Linq Queries - recherche d'idées

Nous écrivons des commandes pour ce CMS, mais je préférerais ne pas coupler les contrôles au CMS, parce que nous avons des doutes quant à savoir si nous voulons continuer avec ce CMS à long terme.

Nous pouvons découpler nos contrôles du CMS assez facilement, en utilisant notre propre couche DAL/abstraction ou quoi que ce soit. Ensuite, je me suis rappelé que sur la plupart des contrôles CMS, ils fournissent une propriété (modifiable au moment du design) dans laquelle les utilisateurs peuvent saisir une requête pour contrôler ce qui est rempli dans la source de données. Nice feature - la question est comment puis-je abstrait cette fonctionnalité? Il m'est alors apparu que peut-être un cadre DSL existait là-bas qui pourrait me fournir un langage de requête simple qui pourrait être transformé en une expression LINQ au moment de l'exécution. Me découplant ainsi de la requête DSL du CMS.

Une telle chose existe-t-elle? Est-ce que je perds mon temps? (Probablement celui-ci)

Merci

Répondre

1

cela ne va pas répondre à votre question tout à fait, mais il y a une extension pour LINQ qui vous permet de spécifier des prédicats pour les requêtes LINQ sous forme de chaînes appelées Dynamic LINQ, donc si vous voulez Pour stocker les conditions dans un format basé sur des chaînes, vous pourriez probablement construire votre langage en plus de cela. Vous auriez toujours besoin de trouver un moyen de représenter différentes clauses (où/orderby/etc.) Mais pour les prédicats passés en arguments, vous pourriez utiliser Dynamic LINQ. Notez que Dynamic LINQ vous permet d'analyser la chaîne, mais AFAIK n'a aucun moyen de transformer l'arbre Expression existant en cette chaîne ... il y aurait donc du travail à faire pour cela.

(mais je ne suis pas sûr si je comprends bien la question, alors peut-être que je suis tout à fait de :-))

+0

Je pense que vous avez compris le sens de ma question - merci. En ce qui concerne les expressions, je voulais seulement passer d'une chaîne à LINQ, pas l'inverse, donc ce n'est pas un problème. – Schneider

+0

Dynamic LINQ semble utile, mais vous avez raison. Je devrais fournir des champs séparés pour mes clauses where et orderby. Pas de gros problème je suppose. P.S. Je cherche toujours plus de réponses si quelqu'un a des idées. – Schneider