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
490 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 :

<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>
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 :

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

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>
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!

source:php.cn
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