Какова цель метода LINQ Expression.Quote?

В документации MSDN указано:

Expression.Quote

Метод Создает UnaryExpression, представляющее выражение, которое имеет постоянное значение выражения типа.

Я смог создать предикатные выражения для использования в запросах LINQ, вручную создав их с помощью класса Expression, но никогда не сталкивался с необходимостью выражения Expression.Quote.

Когда и зачем вы это используете? Из выражений LINQ, которые я видел у них, они просто переносят существующие выражения без добавления каких-либо значений.

Какова цель метода Quote/ node type?

Ответ 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?

Как указывал StevenH, Expression.Quote используется при реализации LINQ Query Providers. Все методы на Queryable, которые принимают лямбда-выражение, например Where, OrderBy, GroupBy и т.д., Внутренне конструируют MethodCallExpression с помощью Expression.Call и переносят параметры лямбда-выражения с помощью вызовов Expression.Quote.

Для более подробного объяснения Expression.Quote прочитайте этот ответ.