obj.Prop" en "parent => parent.obj.Prop" Dans le but de modifier une expression Linq existante de type..."/> obj.Prop" en "parent => parent.obj.Prop" Dans le but de modifier une expression Linq existante de type...">
Maison >développement back-end >C++ >Comment retravailler une expression LINQ de « obj => obj.Prop » à « parent => parent.obj.Prop » ?
obj.Prop" à "parent => parent.obj.Prop" ? " /> Refactoriser "obj => obj.Prop" en "parent => parent.obj.Prop" ?
Refactorisez l'expression LINQ "obj => obj.Prop" en "parent => parent.obj.Prop"
Lors de la modification d'une expression LINQ existante de type Expression<Func<object>>
pour accepter une classe parent, des défis surviennent lorsque l'expression implique des propriétés imbriquées. La méthode ExpressionFromField<TModel>
existante a des problèmes pour gérer des expressions telles que cust => cust.Address.State
car elle ne peut pas accéder explicitement à l'objet intermédiaire (cust.Address
dans ce cas).
La solution réside dans la composition des expressions, qui combine plusieurs expressions en une seule. Voici la méthode étape par étape :
1. Méthode de combinaison d'expressions
Définissez une méthode statique nommée Compose<T, TIntermediate, TResult>
qui accepte trois délégués d'expression :
<code class="language-csharp">public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>( this Expression<Func<T, TIntermediate>> first, Expression<Func<TIntermediate, TResult>> second) { // 用第二个表达式的参数替换第一个表达式的参数出现 return Expression.Lambda<Func<T, TResult>>( second.Body.Replace(second.Parameters[0], first.Body), first.Parameters[0]); }</code>
2. Remplacement d'expression
Crée une classe nommée ReplaceVisitor
qui est dérivée de ExpressionVisitor
:
<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); } }</code>
Ajouter une méthode d'extension Expression
à la classe Replace
:
<code class="language-csharp">public static Expression Replace(this Expression ex, Expression from, Expression to) { return new ReplaceVisitor(from, to).Visit(ex); }</code>
3. Combinaison d'applications
Avec les méthodes de combinaison et de substitution en place, vous pouvez désormais construire de nouvelles expressions :
<code class="language-csharp">// 选择属性的表达式: Expression<Func<Customer, object>> propertySelector = cust => cust.Name; // 从模型中选择对象的表达式 Expression<Func<Model, Customer>> modelSelector = model => model.Customer; // 组合表达式 Expression<Func<Model, object>> magic = modelSelector.Compose(propertySelector);</code>
Par combinaison...
Cette réponse révisée conserve le langage et la structure d'origine, en reformulant les expressions et les phrases pour parvenir à une paraphrase sans en altérer le sens.
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!