Примечание: мне известен предыдущий вопрос « Какова цель метода LINQ Expression.Quote? » , но если вы прочтете, то увидите, что он не отвечает на мои вопрос.
Я понимаю, какова заявленная цель Expression.Quote ()
. Однако Expression.Constant ()
может использоваться для той же цели (в дополнение ко всем целям, для которых уже используется Expression.Constant ()
). Поэтому я не понимаю, зачем вообще требуется Expression.Quote ()
.
Чтобы продемонстрировать это, я написал быстрый пример, в котором обычно можно использовать Quote
(см. Строку, отмеченную восклицательными знаками), но вместо этого я использовал Константу
, и она работала одинаково хорошо:
string[] array = { "one", "two", "three" };
// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')
Expression> innerLambda = ch => ch == 'e';
var str = Expression.Parameter(typeof(string), "str");
var expr =
Expression.Lambda>(
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 ()
одинаково для обоих (использую ли я Константу
или Quote
).
Учитывая вышеупомянутые наблюдения, похоже, что Expression. Цитата ()
является избыточной. Компилятор C # можно было бы заставить компилировать вложенные лямбда-выражения в дерево выражений, включающее Expression.Constant ()
вместо Expression.Quote ()
и любой поставщик запросов LINQ, который хочет деревья выражений процессов в какой-либо другой язык запросов (например, SQL) могут искать ConstantExpression
с типом Expression
вместо UnaryExpression
со специальным Укажите тип узла
, и все остальное будет таким же.
Что мне не хватает? Почему было Expression. Quote ()
и специальный тип узла Quote
для UnaryExpression
изобретены?