2010-06-29 9 views
38

La documentación de MSDN:¿Cuál es el propósito del método LINQ Expression.Quote?

Expression.Quote

método crea un UnaryExpression que representa una expresión que tiene un valor constante de tipo Expresión.

He podido construir expresiones de predicado para usar 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?

+0

"Cuando está construyendo un MethodCallExpression utilizando Expression.Call, los parámetros que son expresiones lambda (LambdaExpression/Expression ) deben usar Expression.Quote para ajustar el parámetro antes de pasar". ¿Es eso cierto? Usando .Net 4.5, puedo pasar satisfactoriamente la Expresión > sin necesidad de citarlas primero con Expression.Quote(). –

+0

Si su parámetro es de tipo 'Func <>', entonces seguro que es todo lo que necesita, pero en el caso de muchos métodos de extensión LINQ 'IQueryable ', el tipo de parámetro es realmente 'Expresión >', y en ese caso necesitarás 'Expression.Quote'. No he intentado hacer esto con .NET 4.5, pero supongo que fue lo mismo. En el momento de escribir, probablemente estaba usando .NET 3.5. – GiddyUpHorsey

Respuesta

23

Expression.Quote especifica que una lambda debe tratarse como un árbol de expresiones y no como una función. Induce la semántica de cierre en su operando.

Cuando usted está construyendo una MethodCallExpression usando Expression.Call, cualquier parámetro que son expresiones lambda (LambdaExpression/Expression<TDelegate>) debe utilizar Expression.Quote para envolver el parámetro antes de pasar en.

Así que para un parámetro de tipo Expression<Func<bool>>, cuando se crea un caso como: () => true, la propiedad de la expresión Type sería Func<bool> mientras que el tipo de la expresión (llamando GetType) sería Expression<Func<bool>>

Así que para obtener un Expression que tiene el valor correcto para la propiedad Type pasa la expresión lambda a Expression.Quote y pasa eso como el parámetro a Expression.Call.

Eché un vistazo a Expression.Quote a través del reflector y mientras el único parámetro es del tipo Expression, debe derivar de LambdaExpression y esto se comprueba dentro del método. Sin interés, ¿alguien sabe por qué MS no hizo simplemente 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 un MethodCallExpression usando Expression.Call y envuelven los parámetros de expresión lambda con Expression.Quote llamadas.

Para una explicación más detallada de Expression.Quote lea esto answer.

Cuestiones relacionadas