LINQ to Custom Query Language?

c# expression-trees linq

Question

J'écris un outil qui nécessite des données d'une source. Cette source sera spécifiée par l'utilisateur. Il peut s'agir par exemple d'une base de données SQL, d'une base de données propriétaire, d'un système de fichiers à plat, qui sait.

J'aimerais que mon interface permettant d'extraire ces types de requête utilise Linq, qui semble être la solution la plus conviviale pour C # et peut exploiter beaucoup de code .NET.

J'ai fait des recherches et j'ai commencé par construire un IQueryProvider à l'aide du formidable tutoriel présenté ici . Cela m'a pris une grande partie du chemin, mais maintenant je suis confus quant à la meilleure façon de faire en sorte que les utilisateurs convertissent l'arbre d'expression en leur code personnalisé.

J'essaie de trouver le meilleur moyen de fournir une interface simple permettant aux utilisateurs de spécifier comment transformer une arborescence d'expression en "code" personnalisé (c'est-à-dire "SQL"), et cela semble assez lourd et complexe - j'imagine parce que c'est exactement ça.

Ma question est la suivante: quel est le meilleur moyen de convertir un arbre d’expression en un langage personnalisé?

Le plus proche que je puisse dire est que je dois utiliser la classe 'Context' pour effectuer ma logique d'analyse personnalisée, mais l'API que j'utilise semble plutôt bas. Existe-t-il des opérations de niveau supérieur que je peux faire pour mapper simplement des opérations sur des chaînes?

Réponse acceptée

Il n’existe pas de méthode simple ou directe pour convertir l’arbre d’expression dans votre langage de requête personnalisé. Vous voudrez peut-être essayer LinqExtender

http://mehfuzh.github.com/LinqExtender/

Qui implémente un modèle de visiteur pour la conversion entre linq et votre dsl.

LinqExtender est une boîte à outils permettant de créer des fournisseurs LINQ personnalisés. Il fournit une couche abstraite sur l'implémentation d'origine IQyeryable et IQueryProvider et fournit un arbre de syntaxe simplifié. En outre, il couvre des éléments tels que la projection, les appels de méthodes, les commandes ordonnées, l'analyse des membres, etc. en interne. Par conséquent, le développeur peut se concentrer davantage sur sa tâche principale sans la complexité

.


Réponse populaire

En général, le meilleur moyen de convertir une arborescence en une autre forme consiste à utiliser le modèle de visiteur .

Plus précisément, consultez la classe ExpressionVisitor sur msdn.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow