Heim >Backend-Entwicklung >C++ >Wie konvertiere ich einen LINQ-Ausdruck von „obj => obj.Prop' in „parent => parent.obj.Prop'?

Wie konvertiere ich einen LINQ-Ausdruck von „obj => obj.Prop' in „parent => parent.obj.Prop'?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-18 07:17:09494Durchsuche

Konvertieren Sie den LINQ-Ausdruck „obj => obj.Prop“ in „parent => parent.obj.Prop“

In einigen Fällen ist es notwendig, einen LINQ-Ausdruck, der eine Eigenschaft direkt von einem Objekt auswählt, in einen Ausdruck zu konvertieren, der eine Eigenschaft über ein übergeordnetes Objekt auswählt. Beispielsweise muss ein Ausdruck wie „cust => cust.Name“ in „parent => parent.Customer.Name“ konvertiert werden.

Hierfür können Sie das Konzept der Ausdruckskomposition verwenden. Dazu gehört das Erstellen einer Funktion, die zwei Ausdrücke als Argumente akzeptiert: einen, der eine Eigenschaft auswählt, und einen anderen, der das Objekt auswählt, das diese Eigenschaft enthält. Das folgende Codebeispiel bietet eine Lösung mit dieser Methode:

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

Darüber hinaus ist eine Hilfsmethode namens „Replace“ erforderlich, um alle Vorkommen eines Ausdrucks zu ersetzen:

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

Mit diesen Hilfsmethoden ist es jetzt möglich, Ausdrücke wie diesen zu kombinieren:

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

Dieser Ansatz bietet eine flexible Lösung zum Kombinieren von Ausdrücken für den Zugriff auf verschachtelte Eigenschaften und eignet sich daher für eine Vielzahl von Szenarien, einschließlich MVC-Methodenparametern.

How to Convert a LINQ Expression from obj.Prop“ zu „parent => parent.obj.Prop“? " />

Das obige ist der detaillierte Inhalt vonWie konvertiere ich einen LINQ-Ausdruck von „obj => obj.Prop' in „parent => parent.obj.Prop'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn