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

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

Выражение.Цитата

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

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

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

Какова цель метода / типа узла Quote?


person John Mills    schedule 29.06.2010    source источник
comment
Когда вы создаете MethodCallExpression с помощью Expression.Call, любые параметры, которые являются лямбда-выражениями (LambdaExpression / Expression ‹TDelegate›), должны использовать Expression.Quote для обертывания параметра перед передачей. Это правда? Используя .Net 4.5, я могу успешно передавать простые выражения Expression ‹Func‹ ›› без необходимости сначала заключать их в кавычки с помощью Expression.Quote ().   -  person Daniel Yankowsky    schedule 11.09.2013
comment
Если ваш параметр имеет тип Func<>, тогда убедитесь, что это все, что вам нужно, но в случае многих методов расширения LINQ IQueryable<T> тип параметра на самом деле Expression<Func<>>, и в этом случае вам понадобится Expression.Quote. Я не пробовал делать это с .NET 4.5, но предполагаю, что это было то же самое. На момент написания я, вероятно, использовал .NET 3.5.   -  person John Mills    schedule 03.10.2013


Ответы (1)


Expression.Quote указывает, что лямбда должна рассматриваться как дерево выражения, а не как функция. Он индуцирует семантику закрытия для своего операнда.

Когда вы конструируете MethodCallExpression с помощью Expression.Call, любые параметры, которые являются лямбда-выражениями (_4 _ / _ 5_), должны использовать 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 прочтите этот ответ.

person John Mills    schedule 02.10.2013