expressions examples linq expression linq-expressions

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?