O que Expression.Quote () faz que Expression.Constant () já não pode fazer?
Nota: estou ciente da pergunta anterior "Qual é o objetivo do método Expression.Quote do LINQ?”, mas se você ler, verá que isso não responde à minha pergunta.
Eu entendo qual o objetivo declarado deExpression.Quote()
é. Contudo,Expression.Constant()
pode ser usado para a mesma finalidade (além de todas as finalidades queExpression.Constant()
já é usado para). Portanto, eu não entendo por queExpression.Quote()
é de todo necessário.
Para demonstrar isso, escrevi um exemplo rápido em que alguém usaria normalmenteQuote
(veja a linha marcada com pontos de exclamação), mas eu useiConstant
e funcionou igualmente bem:
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);
A saída deexpr.ToString()
é o mesmo para os dois também (se eu usoConstant
ouQuote
)
Dadas as observações acima, parece queExpression.Quote()
é redundante. O compilador C # poderia ter sido criado para compilar expressões lambda aninhadas em uma árvore de expressões envolvendoExpression.Constant()
ao invés deExpression.Quote()
, e qualquer provedor de consulta LINQ que queira processar árvores de expressão em outra linguagem de consulta (como SQL) pode procurar umConstantExpression
com tipoExpression<TDelegate>
em vez de umUnaryExpression
com o especialQuote
tipo de nó e tudo o mais seria o mesmo.
o que estou perdendo? Por quê foiExpression.Quote()
e o especialQuote
tipo de nó paraUnaryExpression
inventado?