Quel est le but de la méthode Expression.Quote de LINQ?
-
01-10-2019 - |
Question
Les états de documentation MSDN:
Expression.Quote
méthode crée un UnaryExpression qui représente un expression qui a une valeur constante Type de Expression.
J'ai été en mesure de construire des expressions de prédicats pour une utilisation dans les requêtes LINQ manuellement par les construire en utilisant la classe d'expression, mais n'a jamais rencontré la nécessité d'Expression.Quote.
Quand et pourquoi utiliseriez-vous cela? Des expressions LINQ je l'ai vu qui les ont, ils semblent envelopper expressions existantes sans ajouter de la valeur.
Quel est le but de la méthode de soumission / type de noeud?
La solution
Expression.Quote
spécifie qu'un lambda doit être traité comme un arbre d'expression et non en fonction. Il induit la sémantique de fermeture sur son opérande.
Lorsque vous construisez un MethodCallExpression
en utilisant Expression.Call
, tous les paramètres qui sont des expressions lambda (LambdaExpression
/ Expression<TDelegate>
) doit 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
, la propriété Type
de l'expression serait Func<bool>
alors que le type de l'expression (appelant la GetType
) serait Expression<Func<bool>>
Donc, pour obtenir une Expression
qui a la valeur correcte pour la propriété Type
vous passez l'expression lambda dans Expression.Quote
et passer que le paramètre à Expression.Call
.
J'ai eu un coup d'œil à travers Expression.Quote
réflecteur et alors que le seul paramètre est de type Expression
, il doit provenir de LambdaExpression
et cette case est cochée dans la méthode. Par intérêt, quelqu'un sait pourquoi MS n'a pas seulement fait le type de paramètre soit LambdaExpression
?
Comme StevenH a souligné, Expression.Quote
est utilisé dans la mise en œuvre des fournisseurs de requête LINQ. Toutes les méthodes sur Queryable
qui prennent une expression lambda tels que Where
, OrderBy
, GroupBy
, etc construire en interne un MethodCallExpression
en utilisant Expression.Call
et envelopper les paramètres d'expression lambda avec des appels Expression.Quote
.
Pour une explication plus détaillée de Expression.Quote
lire cette réponse .