2010-05-14 4 views
7

Je me demande comment on traduirait une chaîne sql à un arbre d'expression. Actuellement, dans Linq to SQL, l'arbre d'expression est traduit en une instruction sql. Comment va-t-on dans l'autre sens? Comment traduiriez-vousinstruction SQL à l'arbre d'expression

select * from books where bookname like '%The%' and year > 2008 

dans un arbre d'expression dans C#?

+0

Avez-vous trouvé une solution à cette question? Je suis également dans le besoin d'obtenir un arbre d'expression à partir d'une chaîne sql en C# – Saravanan

Répondre

0

http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx

mise à jour

Entity Framework a la langue Entity SQL. Je ne sais pas si c'est ce que vous voulez.

http://msdn.microsoft.com/en-us/library/bb738521.aspx

+0

Eh bien ... En quelque sorte. Dynamic Linq vous permet de spécifier vos arguments d'expression linq lambda en tant que chaînes, mais vous devez toujours spécifier les méthodes d'extension (.Select, .Where) de vos instructions linq directement. –

+0

ce serait sympa de ne pas utiliser linq dynamique mais purement construit à partir de System.Linq.Expressions –

0

Je ne sais pas s'il y a un moyen plus facile, mais je l'ai écrit un lexer et parser pour les expressions SQL dans une coutume arbre de syntaxe abstraite (comme je ne savais pas Les arbres d'expression de .net à l'époque) et je n'ai pas vraiment aimé analyser SQL.

La syntaxe parser est tout simplement pas très sympathique, que l'ordre est différent selon le contexte (par exemple, la non NOT IN contre IS NOT), les jetons sont surchargées (entre parenthèses pour des raisons impérieuses de la priorité de l'opérateur par défaut par rapport entre parenthèses pour la création d'une liste comme dans WHERE x IN (1, 2)) et ainsi de suite. Il est évident que l'utilisation d'un générateur d'analyseurs plutôt que de faire votre propre lexique et parsing rendrait les choses plus faciles, mais je ne sais pas s'il y a quelque chose de plus spécifique à SQL. Donc, écrire le vôtre est certainement possible, quoique fastidieux.