2010-09-23 23 views
15

Estoy tratando de hacer algunas consultas realmente dinámicas aquí, preferiblemente sin invocar el compilador en tiempo de ejecución.Analizando una expresión de cadena C# LINQ

Tengo una cadena que contiene una expresión LINQ, p.

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

¿Cómo puedo obtener el resultado IQueryable o expresiones de eso?

He visto LINQPad y RavenDb hacer esto, así que estoy convencido de que hay una forma, pero aún no lo he encontrado.

Respuesta

20

usted tiene algunas opciones:

  1. Hacer algo de cosecha propia, analizar el texto y la construcción de un árbol de expresión. El enfoque estándar para esto sería usar un analizador de lenguaje para analizar la cadena (como ANTLR).

  2. Uso CodeDOM para compilar la consulta (no se recomienda para un environent producción, ya que es lento y genera una asamblea por la compilación que se sature el dominio de aplicación con los conjuntos de si haces muchos. Quiero subrayar, no seguir este camino si usted tiene cualquier tipo de volumen - aunque esto es lo que hace LINQPad) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

  3. compilador de uso Mono que emite MSIL directamente (por lo que ninguna asamblea por la compilación y mucho más rápido) - Mono Compiler as a Service (MCS)

  4. uso dinámico LINQ (tiene algunas limitaciones y restricciones, pero básicamente lo que se sugiere en el punto n. ° 1 es bueno, liviano y tiene la capacidad de permitir solo ciertas llamadas a métodos. Se analiza la consulta de texto y construye un árbol de expresión de ella) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+1

# 1 no es práctico. # 3 no funciona bajo Microsoft CLR (lo probé ...). # 4 funciona bien, pero sí, viene con limitaciones. –

+0

Voy a probar el # 3, leí una publicación hace un tiempo en el blog de Miguel de Icaza que Mono.CSharp ahora funciona en MS CLR. –

+2

Número 3 funciona bajo MS Windows CLR. Intenté y actualmente lo uso en producción. Si te está dando problemas, revisa mi publicación en él. Kevin, si vas con el número 3, asegúrate de seguir las instrucciones en mi publicación a la que me he vinculado o no podrás usar LINQ y terminarás con el mismo ensamblado por problema de compilación que CodeDom. – Jeff

0

Pasar de una "cadena mágica" al código de objetos siempre implica algún tipo de análisis. En este caso, podría ser mejor trabajar con la biblioteca EditableExpression (disponible de forma gratuita desde Google Code). Tome su cadena y formatéela para que parezca el resultado de serializar una serie de EditableExpressions. Luego, simplemente deserialízala y conviértela en un árbol de expresiones.

+0

¿Por qué esos votos abajo? –

Cuestiones relacionadas