Arbol de expresion

asp.net c# expression-trees

Pregunta

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

Los árboles de expresiones son representaciones en memoria de expresiones como aritméticas o booleanas. Las expresiones se almacenan en el árbol analizado, por lo que podemos traducir fácilmente a cualquier otro idioma.

Linq to SQL utiliza el árbol de expresiones. Normalmente, en la consulta LINQ to SQL el compilador lo traduce en árboles de expresiones analizados. Estos se pasan al servidor Sql como declaraciones T-SQL. El servidor Sql ejecuta la consulta T-SQL y devuelve el resultado. 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 los árboles de Expresión para jugar con LINQ-to-Sql. ¿Cuáles son las diferentes maneras en que puedo usar los árboles de expresión para aumentar mi código?

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

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

Respuesta aceptada

Los árboles de expresión ofrecen una forma de inspeccionar parte del código antes de que se compile, en tiempo de ejecución.

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

  • Compílalo en un delegado, utilizando Expression.Compile , o
  • Visite los nodos del árbol y genere algo más a partir de él (es decir, una declaración SQL).

Los árboles de expresiones son geniales, pero las probabilidades de que tengan alguna utilidad directa para un sitio web o una aplicación empresarial típica son remotas. Solo los usaría cuando (a) desee generar un tipo diferente de código de fuente C # en tiempo de ejecución, o (b) quiera usar Reflection pero proporcione cierta 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 intenta ampliar uno de estos marcos (incluido Linq-to-XYZ), es probable que encuentre un uso para los árboles de expresión (como la extensión de actualización por lotes de Linq a SQL), aunque es difícil discutir ejemplos específicos porque dependería completamente del diseño de dicho marco.

Si no estás construyendo este tipo de herramientas, los árboles de expresiones no son mucho más que una curiosidad. Claro que puedes aprender, por supuesto, pero no te decepciones si no encuentras demasiados usos prácticos para ellos.

Algunos ejemplos de bibliotecas que usan árboles de expresión:

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


Respuesta popular

  1. ¿Qué quieres decir con 'aumentar mi código'?
    Los árboles de expresión no aumentarán (normalmente) el rendimiento; se utilizan para habilitar la funcionalidad adicional.
  2. Los árboles de expresiones no tienen nada que ver con LINQ. Por ejemplo, los sistemas de inyección de dependencias los utilizan para especificar tipos y funciones de manera eficiente.
  3. LINQ to XML devuelve IEnumerable<XElement> s.


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow