Maison > développement back-end > C++ > Comment convertir une expression LINQ de « obj => obj.Prop » en « parent => parent.obj.Prop » ?

Comment convertir une expression LINQ de « obj => obj.Prop » en « parent => parent.obj.Prop » ?

Patricia Arquette
Libérer: 2025-01-18 07:17:09
original
557 Les gens l'ont consulté

Convertir l'expression LINQ "obj => obj.Prop" en "parent => parent.obj.Prop"

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 :

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]);
}
Copier après la connexion

De plus, une méthode d'assistance appelée "Replace" est requise pour remplacer toutes les occurrences d'une expression :

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);
}
Copier après la connexion

Grâce à ces méthodes d'assistance, il est désormais possible de combiner des expressions comme celle-ci :

// 从对象中选择一个属性
Expression<Func<Customer, string>> propertySelector = cust => cust.Name;

// 从模型中选择对象
Expression<Func<Model, Customer>> modelSelector = model => model.Customer;

// 组合两个表达式
Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);
Copier après la connexion

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.

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

Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal