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 » ?

Comment retravailler une expression LINQ de « obj => obj.Prop » à « parent => parent.obj.Prop » ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-18 07:07:09233parcourir

How to Rework a LINQ Expression from 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn