Какова цель метода LINQ Expression.Quote? - PullRequest
41 голосов
/ 29 июня 2010

Документация MSDN гласит:

Expression.Quote

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

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

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

Для чего нужен метод / тип узла Quote?

1 Ответ

25 голосов
/ 03 октября 2013

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. Все методы в Queryable, которые принимают лямбда-выражения, такие как Where, OrderBy, GroupBy и т. Д., Внутренне создают MethodCallExpression, используя Expression.Call, и обертывают параметры лямбда-выражения вызовами Expression.Quote.

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

...