Что Expression.Quote () делает то, что Expression.Constant () не может уже сделать?
Примечание: мне известен предыдущий вопросКакова цель метода LINQ Expression.Quote?”, но если вы читаете дальше, вы увидите, что это не отвечает на мой вопрос.
Я понимаю в чем заявленная цельExpression.Quote()
является. Тем не мение,Expression.Constant()
может использоваться для той же цели (в дополнение ко всемExpression.Constant()
уже используется для). Поэтому я не понимаю, почемуExpression.Quote()
это вообще требуется.
Чтобы продемонстрировать это, я написал быстрый пример, где обычноQuote
(см. строку, отмеченную восклицательными знаками), но я использовалConstant
вместо этого и он работал одинаково хорошо:
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);
Выход изexpr.ToString()
одинаково для обоих тоже (использую ли яConstant
или жеQuote
).
Учитывая вышеприведенные наблюдения, представляется, чтоExpression.Quote()
избыточно Компилятор C # мог быть создан для компиляции вложенных лямбда-выражений в дерево выражений, включающееExpression.Constant()
вместоExpression.Quote()
и любой поставщик запросов LINQ, который хочет обрабатывать деревья выражений на каком-либо другом языке запросов (например, SQL), может искатьConstantExpression
с типомExpression<TDelegate>
вместоUnaryExpression
с особымQuote
тип узла, а все остальное будет таким же.
Что мне не хватает? ПочемуExpression.Quote()
и специальныйQuote
тип узла дляUnaryExpression
изобрел?