.net - net - ¿Los árboles de expresión de LINQ están completos?
predicate builder net core (4)
Los árboles de expresiones LINQ pueden representar cualquier cosa que pueda poner en una expresión C # normal. Como tales, no se pueden usar para representar directamente bucles while, bucles, etc.
Sin embargo, teóricamente es posible utilizar expresiones lambda y recursión para llevar a cabo cualquier iteración que pueda necesitar. En la práctica, puede ser más fácil eliminar los métodos Enumerable
en su árbol.
Como están en .Net 3.5. Sé que están en 4.0, ya que es con lo que trabaja DLR, pero estoy interesado en la versión que tenemos ahora.
Sin definir lo que ejecutará el árbol, no lo sabemos. En la propia interpretación del CLR (cuando los compila en delegados) lo son. Pero si los traduce a SQL, no lo son, y puede inventar su propia interpretación confusa de ellos con las propiedades que desee.
Hasta que haya decidido cómo interpretarlos, solo son estructuras de datos.
Bueno, ¿por qué no intentas probarlo? Apuesto a que es un desafío divertido;)
Pero los árboles de expresiones solo representan una expresión y, como tal, tendrás que definir lo que se te permite hacer, como afirma Earwicker.
Si permite que los árboles de expresión usen la recursión, puede lograr la repetición, es decir, para bucles y demás.
Sin embargo, el cálculo lambda no tipificado es Turing-completo. Complejidad de Turing # Ejemplos, pero el cálculo Lambda no permite la recursión per se Lambda_calculus # Recursion, todo es muy arriesgado.
Concluiría que esa expresión probablemente esté completa, pero requerirá que alguien que esté más familiarizado con esto lo confirme.
En el borrador inicial de la especificación C # 3.0, había un comentario al margen de la sección sobre árboles de expresiones que decía:
Tengo una prueba verdaderamente maravillosa de la completitud de Turing, que este margen es demasiado estrecho para contener.
Lamentablemente, nadie ha sido capaz de descubrir quién lo escribió o desarrollar la prueba.