Heim >Backend-Entwicklung >C++ >Wie konvertiere ich einen LINQ-Ausdruck wie „obj => obj.Prop' in „parent => parent.obj.Prop' für den Zugriff auf verschachtelte Objekte?

Wie konvertiere ich einen LINQ-Ausdruck wie „obj => obj.Prop' in „parent => parent.obj.Prop' für den Zugriff auf verschachtelte Objekte?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-18 07:12:08509Durchsuche

How to Convert a LINQ Expression like obj.Prop“ zu „parent => parent.obj.Prop“ für den Zugriff auf verschachtelte Objekte? " />

LINQ-Ausdruck „obj => obj.Prop“ in „parent => parent.obj.Prop“ konvertieren: Schritt-für-Schritt-Anleitung

LINQ-Ausdrücke bieten eine leistungsstarke Möglichkeit, auf die Eigenschaften eines Objekts zuzugreifen. Manchmal müssen Sie jedoch mehrere Ebenen einer Hierarchie durchlaufen, beispielsweise um auf Eigenschaften verschachtelter Objekte zuzugreifen.

Betrachten Sie den folgenden LINQ-Ausdruck:

<code class="language-c#">cust => cust.Name</code>

Dieser Ausdruck ruft die Name-Eigenschaft des cust-Objekts ab. Was aber, wenn Sie auf die Name-Eigenschaft des Customer-Objekts im CustomerModel zugreifen müssen? Der ursprüngliche Ausdruck scheint unzureichend zu sein.

Um dieses Problem zu lösen, ist eine Methode erforderlich, die den ursprünglichen Ausdruck akzeptiert und einen neuen Ausdruck generiert, wobei die übergeordnete Klasse als Eingabeparameter verwendet wird. Dieser neue Ausdruck wird zum Parameter der MVC-Methode und ermöglicht einen effizienten Zugriff auf verschachtelte Eigenschaften.

Erste Veröffentlichung und Fehler

Ein möglicher Ansatz ist:

<code class="language-c#">public Expression<Func<object>> ExpressionFromField<T, TModel>(FieldDefinition<T> field)
    where TModel : BaseModel<T>
{
    var param = Expression.Parameter(typeof(TModel), "t");
    var body = Expression.PropertyOrField(param, nameof(SelectedItem));
    var member = Expression.MakeMemberAccess(body, field.Member);
    return Expression.Lambda<Func<object>>(member, param);
}</code>

Diese Version schlägt jedoch beim Zugriff auf verschachtelte Eigenschaften (z. B. cust.Address.State) fehl. Der aufgetretene Fehler weist darauf hin, dass das angegebene Mitglied nicht im Hauptteil vorhanden ist und sich der Hauptteil auf das Kundenobjekt und nicht auf das Adressobjekt bezieht.

Lösung: Ausdruckskombination

Die erforderliche Lösung liegt in der Ausdruckskomposition. So wie Funktionen zusammengesetzt werden können, können auch Ausdrücke zusammengesetzt werden:

<code class="language-c#">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>

Dies basiert auf der Methode „Replace“, um alle Instanzen eines Ausdrucks durch einen anderen Ausdruck zu ersetzen. Mit diesen Methoden ist es möglich, den folgenden Ausdruck zu konstruieren:

<code class="language-c#">Expression<Func<object>> propertySelector = cust => cust.Name;
Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer;
Expression<Func<CustomerModel, object>> magic = modelSelector.Compose(propertySelector);</code>

Magische Ausdrücke können jetzt effektiv auf die Name-Eigenschaft des Customer-Objekts im CustomerModel zugreifen. Es kann als Ausdrucksparameter einer MVC-Methode verwendet werden und bietet nahtlosen Zugriff auf verschachtelte Eigenschaften.

Das obige ist der detaillierte Inhalt vonWie konvertiere ich einen LINQ-Ausdruck wie „obj => obj.Prop' in „parent => parent.obj.Prop' für den Zugriff auf verschachtelte Objekte?. 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