Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menentukan Secara Dinamik OrderBy Property dalam LINQ?

Bagaimanakah Saya Boleh Menentukan Secara Dinamik OrderBy Property dalam LINQ?

Susan Sarandon
Susan Sarandonasal
2025-01-10 12:35:42350semak imbas

How Can I Dynamically Specify the OrderBy Property in LINQ?

Tentukan secara dinamik parameter LINQ OrderBy

Dalam C#, kaedah OrderBy LINQ membenarkan pengisihan data berdasarkan sifat atau ungkapan yang ditentukan. Tetapi bagaimanakah kita secara dinamik menentukan sifat atau ungkapan untuk diisih mengikut?

Soalan:

Memandangkan parameter, kami ingin mengisih senarai pelajar berdasarkan atribut yang ditentukan, tetapi pada masa ini, nama atribut dalam panggilan OrderBy dikodkan keras.

Contoh:

<code class="language-csharp">List<Student> existingStudents = new List<Student> { new Student { ... }, new Student { ... } };
List<Student> orderByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>

Sasaran:

Kami mahu mengambil nama sifat sebagai parameter dan bukannya menggunakan nama sifat statik dalam OrderBy.

Contoh:

<code class="language-csharp">string param = "City";
List<Student> orderByCity = existingStudents.OrderBy(c => c.City).ToList(); //仍然需要明确指定属性</code>

Penyelesaian:

Menggunakan refleksi, kita boleh membina ungkapan OrderBy secara dinamik:

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc)
{
    // ...  (反射代码构建表达式树) ...
    return source.Provider.CreateQuery<T>(resultExpression);
}</code>

Anda kemudian boleh mengisih secara dinamik mengikut atribut yang ditentukan:

<code class="language-csharp">existingStudents.OrderBy("City", true); // 降序
existingStudents.OrderBy("City", false); // 升序</code>

(Nota: Pelaksanaan kod refleksi lengkap adalah lebih rumit dan ditinggalkan di sini. Anda perlu menggunakan ruang nama System.Linq.Expressions untuk membina pepohon ungkapan dan mengendalikan kemungkinan pengecualian, seperti atribut yang tidak wujud.) Penyelesaian ini memberikan idea pengisihan dinamik Pelaksanaan lengkap memerlukan penulisan kod yang lebih mantap mengikut situasi sebenar. Menggunakan c => param secara langsung adalah satu kesilapan, kerana ini hanya akan mengisih rentetan parameter itu sendiri, bukan sifat objek pelajar. Refleksi mesti digunakan untuk memperoleh sifat secara dinamik dan membina pepohon ungkapan yang betul.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Secara Dinamik OrderBy Property dalam LINQ?. 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