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!