¿Qué hace Expression.Quote () que Expression.Constant () ya no puede hacer?
Nota: Soy consciente de la pregunta anterior "¿Cuál es el propósito del método Expression.Quote de LINQ?”, pero si sigue leyendo, verá que no responde a mi pregunta.
Entiendo cuál es el propósito declarado deExpression.Quote()
es. Sin embargo,Expression.Constant()
puede usarse para el mismo propósito (además de todos los propósitos queExpression.Constant()
ya se usa para). Por lo tanto, no entiendo por quéExpression.Quote()
es en absoluto necesario
Para demostrar esto, he escrito un ejemplo rápido donde uno usaría habitualmenteQuote
(vea la línea marcada con signos de exclamación), pero yo uséConstant
en cambio y funcionó igualmente bien:
string[] array = { "one", "two", "three" };
// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')
Expression<Func<char, bool>> innerLambda = ch => ch == 'e';
var str = Expression.Parameter(typeof(string), "str");
var expr =
Expression.Lambda<Func<string, bool>>(
Expression.Call(typeof(Queryable), "Any", new Type[] { typeof(char) },
Expression.Call(typeof(Queryable), "AsQueryable",
new Type[] { typeof(char) }, str),
// !!!
Expression.Constant(innerLambda) // <--- !!!
),
str
);
// Works like a charm (prints one and three)
foreach (var str in array.AsQueryable().Where(expr))
Console.WriteLine(str);
La salida deexpr.ToString()
es lo mismo para ambos también (si usoConstant
oQuote
)
Dadas las observaciones anteriores, parece queExpression.Quote()
Es redundante. El compilador de C # podría haberse hecho para compilar expresiones lambda anidadas en un árbol de expresiones que involucraExpression.Constant()
en lugar deExpression.Quote()
, y cualquier proveedor de consultas LINQ que desee procesar árboles de expresión en algún otro lenguaje de consulta (como SQL) podría buscar unConstantExpression
con tipoExpression<TDelegate>
en vez de unaUnaryExpression
con el especialQuote
tipo de nodo, y todo lo demás sería igual.
¿Qué me estoy perdiendo? Por qué eraExpression.Quote()
y el especialQuote
tipo de nodo paraUnaryExpression
inventado?