What is the purpose of LINQ's Expression.Quote method?

后端 未结 1 1039
暗喜
暗喜 2021-01-31 14:59

The MSDN documentation states:

Expression.Quote

Method Creates a UnaryExpression that represents an expression that has a

相关标签:
1条回答
  • 2021-01-31 15:12

    Expression.Quote specifies that a lambda is to be treated as an expression tree and not as a function. It induces closure semantics on its operand.

    When you are constructing a MethodCallExpression using Expression.Call, any parameters that are lambda expressions (LambdaExpression/Expression<TDelegate>) must use Expression.Quote to wrap the parameter before passing in.

    So for a parameter of type Expression<Func<bool>>, when you create an instance such as: () => true, the expression's Type property would be Func<bool> whereas the expression's type (calling GetType) would be Expression<Func<bool>>

    So to get an Expression that has the correct value for the Type property you pass the lambda expression into Expression.Quote and pass that as the parameter to Expression.Call.

    I had a look at Expression.Quote through reflector and while the sole parameter is of type Expression, it must derive from LambdaExpression and this is checked inside the method. Out of interest, anyone know why MS didn't just make the parameter type be LambdaExpression?

    As StevenH pointed out, Expression.Quote is used in implementing LINQ Query Providers. All the methods on Queryable that take a lambda expression such as Where, OrderBy, GroupBy, etc internally construct a MethodCallExpression using Expression.Call and wrap the lambda expression parameters with Expression.Quote calls.

    For a more detailed explanation of Expression.Quote read this answer.

    0 讨论(0)
提交回复
热议问题