Heim >Backend-Entwicklung >C++ >Wie konvertiere ich einen LINQ-Ausdruck von „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.
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!