Какова цель метода 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 прочитайте этот ответ.

Другие вопросы по тегам