Dalam sesetengah kes, adalah perlu untuk menukar ungkapan LINQ yang memilih sifat terus daripada objek kepada ungkapan yang memilih sifat melalui objek induk. Contohnya, ungkapan seperti "cust => cust.Name" perlu ditukar kepada "parent => parent.Customer.Name".
Untuk ini, anda boleh menggunakan konsep gubahan ungkapan. Ini melibatkan penciptaan fungsi yang menerima dua ungkapan sebagai hujah: satu yang memilih harta dan satu lagi yang memilih objek yang mengandungi harta itu. Contoh kod berikut menyediakan penyelesaian menggunakan kaedah ini:
<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>
Selain itu, kaedah pembantu yang dipanggil "Ganti" diperlukan untuk menggantikan semua kemunculan ungkapan:
<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>
Menggunakan kaedah pembantu ini, kini anda boleh menggabungkan ungkapan seperti ini:
<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>
Pendekatan ini menyediakan penyelesaian yang fleksibel untuk menggabungkan ungkapan untuk mengakses sifat bersarang, menjadikannya sesuai untuk pelbagai senario, termasuk parameter kaedah MVC.
obj.Prop" kepada "parent => parent.obj.Prop"? " />
Atas ialah kandungan terperinci Bagaimana untuk Menukar Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!