2010-03-28 21 views
5

Mi comprensión de árbol de expresión es:Expresión árbol

árboles de expresión son en memoria representación de expresión como expresiones aritméticas o booleanas expression.The se almacenan en el analizada tree.so podemos transalate fácilmente en cualquier otro idioma .

Linq to SQL utiliza la expresión tree.Normally en LINQ to SQL consulta el compilador traduce en la expresión analizada trees.These se pasan a SQL Server como servidor de T-SQL Statements.The SQL ejecuta la consulta T-SQL y envía el resultado de nuevo .que es por eso que cuando se ejecuta LINQ to SQL le consigue IQueryable<T> no IEnumetrable<T> .Because IQuerybale contiene

public IQueryable:IEnumerable 
{ 

    Type Element {get;} 
    Expression Expression {get;} 
    IQueryaleProvider Provider {get;} 
} 

Preguntas:

  1. Microsoft usa Árboles de expresión para jugar con LINQ-to-Sql. ¿Cuáles son las formas diferentes en que puedo usar árboles de expresión para aumentar mi código?

  2. Además de LINQ to SQL, Linq to amazon, ¿quién usó árboles de expresión en sus aplicaciones?

  3. Linq a Objeto return IEnumerable, Linq a SQL return IQueryable, ¿Qué devuelve LINQ to XML?

Respuesta

10

Los árboles de expresiones ofrecen una forma de inspeccionar algún código antes de compilarlo, en tiempo de ejecución.

Usted puede hacer exactamente dos cosas con un árbol de expresión:

  • compilarlo en un delegado, utilizando Expression.Compile o
  • Visita los nodos del árbol y generar algo más de ella (es decir, una instrucción SQL) .

árboles de expresiones son frescas, pero las probabilidades de ellos realmente tener ningún directa utilidad para un sitio web o aplicación empresarial típica son remotas. Solo los usaría cuando (a) desee generar un tipo diferente de código desde la fuente C# en el tiempo de ejecución, o (b) desee usar Reflection pero proporcione alguna medida de seguridad en tiempo de compilación.

Si está trabajando en bibliotecas reutilizables - marcos DI, marcos AOP, marcos MVC/MVP/MVVM, marcos ORM, etc., o tratando de ampliar uno de estos marcos (incluido Linq-to-XYZ), entonces es probable que encuentre un uso para los árboles de expresiones (como la extensión de Linq a SQL batch update), aunque es difícil analizar ejemplos específicos de porque dependerá totalmente del diseño de dicho marco.

Si no está construyendo este tipo de herramientas, los árboles de expresión no son mucho más que una curiosidad. Ideal para aprender, por supuesto, pero no se desilusione si no encuentra demasiados usos prácticos para ellos.

Algunos ejemplos de bibliotecas que utilizan los árboles de expresión:

... Eso debería darte una idea del tipo de proyectos que hacen un uso serio de los árboles de expresión. Entonces, si está construyendo su propio entorno de tiempo de ejecución o MVC, definitivamente quiere aprender todo lo que pueda. ;)

+0

Gracias. Seguiré su consejo. – user274364

3
  1. ¿Qué quiere decir por 'impulsar mi código'?
    Los árboles de expresión no (por lo general) aumentan el rendimiento; se usan para habilitar funcionalidad adicional.
  2. Los árboles de expresiones no tienen nada que ver con LINQ. Por ejemplo, los sistemas de inyección de dependencia los utilizan para especificar tipos y funciones de manera eficiente.
  3. LINQ to XML returns IEnumerable<XElement> s.
+0

lo siento.Para mejorar mi código. – user274364

0
public static void CreatingExpressionTree() 
{ 
    ParameterExpression parameter1 = Expression.Parameter(typeof(int), "x"); 
    BinaryExpression multiply = Expression.Multiply(parameter1, parameter1); 
    Expression<Func<int, int>> square = Expression.Lambda<Func<int, int>>(
     multiply, parameter1); 
    Func<int, int> lambda = square.Compile(); 
    Console.WriteLine(lambda(5)); 
} 
+0

¿Por qué está utilizando Func lambda = square.Compile(); –

0

Pocos son los escenarios donde puede usar el árbol de expresiones.

1) Motor de regla dinámica: en lugar de codificar con fuerza la lógica de la regla en su código. Puede construir su lógica de regla empresarial en tiempo de ejecución.

2) Consultas dinámicas de Linq: hay varias situaciones en las que el desarrollador debe escribir consultas codificadas. Entonces puedes eliminar esto usando el árbol de expresiones.

Cuestiones relacionadas