2010-09-23 7 views
15

J'essaie d'effectuer des requêtes vraiment dynamiques ici - de préférence sans invoquer le compilateur lors de l'exécution.Analyse d'une chaîne C# expression LINQ

J'ai une chaîne contenant une expression LINQ, par ex.

var s = "from a in queryable where a.Type == 1 select a"; 

Comment puis-je obtenir le résultat IQueryable ou expressions de cette? J'ai vu LINQPad et RavenDb tous les deux faire cela donc je suis convaincu qu'il y a un moyen, je ne l'ai pas encore trouvé.

Répondre

20

Vous avez quelques options:

  1. Est-ce quelque chose Homegrown, analyse le texte et la construction d'un arbre d'expression. L'approche standard à ceci serait d'utiliser un analyseur de langage pour analyser la chaîne (comme ANTLR). Utilisez CodeDOM pour compiler la requête (NON recommandé pour un environnement de production car il est lent et génère un assemblage par compilation qui va saturer votre AppDomain avec des assemblys si vous en faites beaucoup. si vous avez une sorte de volume - bien que ce soit ce que LINQPad fait) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

  2. compilateur Utilisons Mono qui émet MSIL directement (donc pas d'assemblage par compilation et beaucoup plus rapide) - Mono Compiler as a Service (MCS)

  3. utilisation dynamique LINQ (a quelques limitations et restrictions, mais fondamentalement fait ce qui est suggéré au point # 1 est agréable, léger et a la capacité de n'autoriser que certains appels de méthode. Il analyse la requête de texte et construit un arbre d'expression de celui-ci) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+1

# 1 n'est pas pratique. # 3 ne fonctionne pas sous Microsoft CLR (essayé ...). # 4 fonctionne bien mais oui, il vient avec des limitations. –

+0

Je vais essayer # 3, j'ai lu il y a un moment sur le blog de Miguel de Icaza que Mono.CSharp fonctionne maintenant sur MS CLR. –

+2

Le numéro 3 fonctionne sous MS Windows CLR. Je l'ai essayé et je l'utilise actuellement en production. Si cela vous donne des prolems, consultez mon post dessus. Kevin, si vous allez avec le numéro 3, assurez-vous de suivre les instructions dans mon article auquel je suis lié ou vous ne pourrez pas utiliser LINQ et vous obtiendrez le même assemblage par problème de compilation que CodeDom. – Jeff

0

Passer d'une « chaîne magique » au code des objets implique toujours une sorte d'analyse syntaxique. Dans ce cas, il est préférable de travailler avec la bibliothèque EditableExpression (disponible gratuitement à partir de Google Code). Prenez votre chaîne et formatez-la pour qu'elle ressemble au résultat de la sérialisation d'une série d'EditableExpressions. Ensuite, désérialisez-la simplement et convertissez-la en un arbre d'expression.

+0

Pourquoi ces votes? –