examples - ¿Cuál es el propósito del método LINQ Expression.Quote?
linq predicate (1)
Expression.Quote
especifica que una lambda se debe tratar como un árbol de expresiones y no como una función. Induce la semántica de cierre en su operando.
Cuando construye un MethodCallExpression
utilizando Expression.Call
, los parámetros que son expresiones lambda ( LambdaExpression
/ Expression<TDelegate>
) deben usar Expression.Quote
para ajustar el parámetro antes de pasar.
Entonces, para un parámetro de tipo Expression<Func<bool>>
, cuando crea una instancia como: () => true
, la propiedad Type
la expresión sería Func<bool>
mientras que el tipo de la expresión (llamando a GetType
) sería Expression<Func<bool>>
Entonces, para obtener una Expression
que tenga el valor correcto para la propiedad Type
, pase la expresión lambda a Expression.Quote
y pase eso como el parámetro a Expression.Call
.
LambdaExpression
un vistazo a Expression.Quote
través del reflector y, aunque el único parámetro es de tipo Expression
, debe derivar de LambdaExpression
y esto se comprueba dentro del método. Por interés, ¿alguien sabe por qué MS no hizo que el tipo de parámetro sea LambdaExpression
?
Como StevenH señaló, Expression.Quote
se usa para implementar proveedores de consultas LINQ. Todos los métodos en Queryable
que toman una expresión lambda como Where
, OrderBy
, GroupBy
, etc. construyen internamente una MethodCallExpression
usando Expression.Call
y envuelven los parámetros de la expresión lambda con llamadas a Expression.Quote
.
Para una explicación más detallada de Expression.Quote
lea esta answer .
La documentación de MSDN indica:
Expresión.Cita
Método Crea una Expresión Unaria que representa una expresión que tiene un valor constante de tipo Expresión.
He podido construir expresiones de predicados para utilizarlas en consultas LINQ al construirlas manualmente utilizando la clase Expression, pero nunca he encontrado la necesidad de Expression.Quote.
¿Cuándo y por qué usarías esto? De las expresiones LINQ que he visto que los tienen, parecen envolver las expresiones existentes sin agregar ningún valor.
¿Cuál es el propósito del método / tipo de nodo Cita?