LINQ的Expression.Quote方法的目的是什么?

时间:2010-06-29 05:43:16

标签: linq expression linq-expressions

MSDN文档声明:

  

Expression.Quote

     

方法创建一个   代表一个的UnaryExpression   具有常量值的表达式   类型表达式。

我已经能够通过使用Expression类手动构建谓词表达式来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求。

你何时以及为何使用这个?从我见过的LINQ表达式中可以看出,它们似乎只是在不添加任何值的情况下包装现有表达式。

Quote方法/节点类型的目的是什么?

1 个答案:

答案 0 :(得分:25)

Expression.Quote指定将lambda视为表达式树而不是函数。它在其操作数上引发闭包语义。

使用MethodCallExpression构建Expression.Call时,任何lambda表达式(LambdaExpression / Expression<TDelegate>)的参数都必须使用Expression.Quote来包装参数在传入之前。

因此,对于类型为Expression<Func<bool>>的参数,当您创建一个实例,例如:() => true时,表达式的Type属性将为Func<bool>而表达式的类型(调用GetType)将Expression<Func<bool>>

因此,要获得具有Expression属性的正确值的Type,请将lambda表达式传递给Expression.Quote,并将其作为参数传递给Expression.Call。< / p>

我通过反射器查看Expression.Quote,而唯一参数的类型为Expression,它必须从LambdaExpression派生,并在方法内部进行检查。出于兴趣,任何人都知道为什么MS不只是将参数类型设为LambdaExpression

正如StevenH所指出的,Expression.Quote用于实现LINQ查询提供程序。采用QueryableWhereOrderBy等lambda表达式的GroupBy上的所有方法都使用MethodCallExpression在内部构建Expression.Call,用Expression.Quote调用包装lambda表达式参数。

有关Expression.Quote的更详细说明,请阅读此answer