obj.Prop" kepada "parent => parent.obj.Prop": Panduan Langkah demi Langkah Ekspresi Linq menyediakan cara yang berkesan untuk..."/> obj.Prop" kepada "parent => parent.obj.Prop": Panduan Langkah demi Langkah Ekspresi Linq menyediakan cara yang berkesan untuk...">
Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Ungkapan LINQ seperti 'obj => obj.Prop' kepada 'parent => parent.obj.Prop' untuk Akses Objek Bersarang?
obj.Prop" kepada "parent => parent.obj.Prop" untuk Akses Objek Bersarang? " />
Tukar ungkapan LINQ "obj => obj.Prop" kepada "parent => parent.obj.Prop": panduan langkah demi langkah
Ekspresi LINQ menyediakan cara yang berkuasa untuk mengakses sifat sesuatu objek. Walau bagaimanapun, kadangkala anda perlu merentasi pelbagai peringkat hierarki, seperti mengakses sifat objek bersarang.
Pertimbangkan ungkapan LINQ berikut:
<code class="language-c#">cust => cust.Name</code>
Ungkapan ini mendapatkan semula sifat Nama objek kust. Tetapi bagaimana jika anda perlu mengakses sifat Nama objek Pelanggan dalam CustomerModel? Ungkapan asal nampaknya tidak mencukupi.
Untuk menyelesaikan masalah ini, satu kaedah diperlukan yang menerima ungkapan asal dan menghasilkan ungkapan baharu, mengambil kelas induk sebagai parameter input. Ungkapan baharu ini akan menjadi parameter kaedah MVC, yang membolehkan akses cekap kepada sifat bersarang.
Keluaran awal dan pepijat
Satu pendekatan yang mungkin ialah:
<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>
Walau bagaimanapun, versi ini gagal apabila mengakses sifat bersarang (cth. cust.Address.State). Ralat yang dihadapi menunjukkan bahawa ahli yang ditentukan tidak wujud dalam badan, dan badan merujuk kepada objek Pelanggan dan bukannya objek Alamat.
Penyelesaian: gabungan ekspresi
Penyelesaian yang diperlukan terletak pada komposisi ekspresi. Sama seperti fungsi boleh digubah, ungkapan juga boleh digubah:
<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>
Ini bergantung pada kaedah Ganti untuk menggantikan semua kejadian satu ungkapan dengan ungkapan lain. Dengan kaedah ini, adalah mungkin untuk membina ungkapan berikut:
<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>
Ekspresi ajaib kini boleh mengakses sifat Nama objek Pelanggan dengan berkesan dalam CustomerModel. Ia boleh digunakan sebagai parameter ekspresi kaedah MVC, memberikan akses lancar kepada sifat bersarang.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Ungkapan LINQ seperti 'obj => obj.Prop' kepada 'parent => parent.obj.Prop' untuk Akses Objek Bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!