Dans certains cas, il est nécessaire de convertir une expression LINQ qui sélectionne une propriété directement à partir d'un objet en une expression qui sélectionne une propriété via un objet parent. Par exemple, une expression telle que « cust => cust.Name » doit être convertie en « parent => parent.Customer.Name ».
Pour cela, vous pouvez utiliser la notion de composition d'expression. Cela implique de créer une fonction qui accepte deux expressions comme arguments : une qui sélectionne une propriété et une autre qui sélectionne l'objet qui contient cette propriété. L'exemple de code suivant fournit une solution utilisant cette méthode :
<code class="language-csharp">public static Expression<Func<TFirst, TResult>> Compose<TFirst, TIntermediate, TResult>( this Expression<Func<TFirst, TIntermediate>> first, Expression<Func<TIntermediate, TResult>> second) { return Expression.Lambda<Func<TFirst, TResult>>( second.Body.Replace(second.Parameters[0], first.Body), first.Parameters[0]); }</code>
De plus, une méthode d'assistance appelée "Replace" est requise pour remplacer toutes les occurrences d'une expression :
<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor { private readonly Expression from, to; public ReplaceVisitor(Expression from, Expression to) { this.from = from; this.to = to; } public override Expression Visit(Expression ex) { if (ex == from) return to; else return base.Visit(ex); } } public static Expression Replace(this Expression ex, Expression from, Expression to) { return new ReplaceVisitor(from, to).Visit(ex); }</code>
Grâce à ces méthodes d'assistance, il est désormais possible de combiner des expressions comme celle-ci :
<code class="language-csharp">// 从对象中选择一个属性 Expression<Func<Customer, string>> propertySelector = cust => cust.Name; // 从模型中选择对象 Expression<Func<Model, Customer>> modelSelector = model => model.Customer; // 组合两个表达式 Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
Cette approche fournit une solution flexible pour combiner des expressions pour accéder aux propriétés imbriquées, ce qui la rend adaptée à une variété de scénarios, y compris les paramètres de la méthode MVC.
obj.Prop" à "parent => parent.obj.Prop" ? " />
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!