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

Wie überarbeite ich einen LINQ-Ausdruck von „obj => obj.Prop' zu „parent => parent.obj.Prop'?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-18 07:07:09233Durchsuche

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

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

Beim Ändern eines vorhandenen LINQ-Ausdrucks vom Typ Expression<Func<object>>, um eine übergeordnete Klasse zu akzeptieren, treten Herausforderungen auf, wenn der Ausdruck verschachtelte Eigenschaften umfasst. Die vorhandene ExpressionFromField<TModel>-Methode hat Probleme mit der Verarbeitung von Ausdrücken wie cust => cust.Address.State, da sie nicht explizit auf das Zwischenobjekt zugreifen kann (in diesem Fall cust.Address).

Die Lösung liegt in der Ausdruckskomposition, die mehrere Ausdrücke zu einem kombiniert. Hier ist die Schritt-für-Schritt-Anleitung:

1. Ausdruckskombinationsmethode

Definieren Sie eine statische Methode mit dem Namen Compose<T, TIntermediate, TResult>, die drei Ausdrucksdelegaten akzeptiert:

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

Erstellt eine Klasse mit dem Namen ReplaceVisitor, die von ExpressionVisitor abgeleitet ist:

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

Fügen Sie eine Erweiterungsmethode Expression zur Klasse Replace hinzu:

<code class="language-csharp">public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>

3. Anwendungskombination

Mit den vorhandenen Kombinations- und Substitutionsmethoden können Sie jetzt neue Ausdrücke erstellen:

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

Durch Kombination...

Diese überarbeitete Antwort behält die ursprüngliche Sprache und Struktur bei und formuliert Phrasen und Sätze neu, um eine Paraphrasierung zu erreichen, ohne die Bedeutung zu ändern. Das Bild bleibt in seinem ursprünglichen Format und seiner ursprünglichen Position.

Das obige ist der detaillierte Inhalt vonWie überarbeite ich einen LINQ-Ausdruck von „obj => obj.Prop' zu „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