Какова цель метода LINQ Expression.Quote?
Документация MSDN гласит:
Expression.Quote
Метод Создает выражение UnaryExpression, представляющее выражение с постоянным значением типа Expression.
Мне удалось создать выражения предикатов для использования в запросах LINQ, создав их вручную с помощью класса Expression, но никогда не сталкивался с необходимостью Expression.Quote.
Когда и почему вы используете это? Из выражений LINQ, которые я видел, они есть, они просто обертывают существующие выражения без добавления какого-либо значения.
Какова цель метода Quote / типа узла?
1 ответ
Expression.Quote
указывает, что лямбда должна рассматриваться как дерево выражений, а не как функция. Он вызывает семантику замыкания в своем операнде.
Когда вы строите MethodCallExpression
с помощью Expression.Call
любые параметры, которые являются лямбда-выражениями (LambdaExpression
/Expression<TDelegate>
) должен использовать Expression.Quote
обернуть параметр перед передачей.
Так что для параметра типа Expression<Func<bool>>
, когда вы создаете экземпляр, такой как: () => true
Выражение Type
собственность будет Func<bool>
тогда как тип выражения (вызывающий GetType
) было бы Expression<Func<bool>>
Итак, чтобы получить Expression
это имеет правильное значение для Type
свойство, которое вы передаете лямбда-выражение в Expression.Quote
и передать это в качестве параметра Expression.Call
,
Я посмотрел на Expression.Quote
через отражатель и в то время как единственный параметр имеет тип Expression
должно происходить из LambdaExpression
и это проверено внутри метода. Из интереса кто-нибудь знает, почему MS не просто сделала тип параметра LambdaExpression
?
Как указал Стивен, Expression.Quote
используется при реализации LINQ Query Providers. Все методы на Queryable
которые принимают лямбда-выражение, такое как Where
, OrderBy
, GroupBy
и т. д. внутренне построить MethodCallExpression
с помощью Expression.Call
и обернуть параметры лямбда-выражения с Expression.Quote
звонки.
Для более подробного объяснения Expression.Quote
прочитайте этот ответ.