42 votes

Quel est le but de la méthode Expression.Quote de LINQ?

La documentation MSDN états:

De l'Expression.Citation

Méthode Crée un UnaryExpression qui représente une expression qui a une valeur constante de type Expression.

J'ai été en mesure de construire des expressions de prédicat pour une utilisation dans les requêtes LINQ manuellement les construire à l'aide de l'Expression de la classe, mais n'ai jamais rencontré le besoin d'Expression.Devis.

Quand et pourquoi l'utiliser? À partir des expressions LINQ, j'ai vu que eux, ils semblent juste pour envelopper des expressions existantes sans ajout de valeur.

Quel est le but de la Citation de la méthode/de type de nœud?

26voto

GiddyUpHorsey Points 3507

Expression.Quote indique qu'un lambda est d'être traité comme une expression de l'arbre et non pas en fonction. Il induit la fermeture de la sémantique sur son opérande.

Lorsque vous construisez un MethodCallExpression l'aide Expression.Call, tous les paramètres qui sont les expressions lambda (LambdaExpression/Expression<TDelegate>) doivent utiliser Expression.Quote pour envelopper le paramètre avant de passer dans.

Donc, pour un paramètre de type Expression<Func<bool>>, lorsque vous créez une instance telle que: () => true, l'expression de l' Type de la propriété serait Func<bool> alors que l'expression du type (appelant GetType) serait Expression<Func<bool>>

Donc, pour obtenir un Expression qui a de la valeur correcte pour l' Type de la propriété vous passez l'expression lambda en Expression.Quote et que le paramètre Expression.Call.

J'ai eu un coup d'oeil à l' Expression.Quote grâce à réflecteur et alors que le seul paramètre est de type Expression, elle doit dériver de LambdaExpression et cela est vérifié à l'intérieur de la méthode. D'intérêt, quelqu'un sait pourquoi MS n'a pas seulement le type de paramètre être LambdaExpression?

Comme StevenH souligné, Expression.Quote est utilisé dans la mise en œuvre d'une Requête LINQ de Fournisseurs. Toutes les méthodes sur Queryable qui prennent une expression lambda comme Where, OrderBy, GroupBy, etc interne de la construction d'un MethodCallExpression l'aide Expression.Call et envelopper l'expression lambda paramètres avec Expression.Quote des appels.

Pour une explication plus détaillée de l' Expression.Quote lire cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X