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?

Bagaimana untuk Menukar Ungkapan LINQ seperti 'obj => obj.Prop' kepada 'parent => parent.obj.Prop' untuk Akses Objek Bersarang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-18 07:12:08515semak imbas

How to Convert a LINQ Expression like 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn