Bagaimana cara menentukan argumen yang diteruskan orderby
menggunakan nilai yang saya ambil sebagai parameter?
Ex:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
Implementasi saat ini:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
Alih-alih c.Address
, bagaimana saya bisa menganggapnya sebagai parameter?
Contoh
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
OrderBy
adalah fitur Linq, dan aktifIEnumerable
, bukan fitur khususList
. Jangan ragu untuk memutar kembali hasil edit atau mengubahnya lebih lanjut :)Jawaban:
Berikut kemungkinan menggunakan refleksi ...
sumber
ThenBy
metode ini .Anda dapat menggunakan sedikit refleksi untuk membuat pohon ekspresi sebagai berikut (ini adalah metode ekstensi):
orderByProperty
adalah nama Properti yang ingin Anda pesan dan jika parameternya lulus truedesc
, akan mengurutkan dalam urutan menurun; jika tidak, akan mengurutkan dalam urutan menaik.Sekarang Anda harus bisa melakukan
existingStudents.OrderBy("City",true);
atauexistingStudents.OrderBy("City",false);
sumber
Untuk memperluas jawaban oleh @Icarus : jika Anda ingin tipe kembalian dari metode ekstensi menjadi IOrderedQueryable, bukan IQuerable, Anda cukup menampilkan hasilnya sebagai berikut:
sumber
1) Instal System.Linq.Dynamic
2) Tambahkan kode berikut
3) Tulis tombol Anda untuk memilih fungsi Lambda
4) Gunakan pembantu Anda
5) Anda dapat menggunakannya dengan pagging ( PagedList )
Penjelasan
System.Linq.Dynamic memungkinkan kita untuk mengatur nilai string dalam metode OrderBy. Tetapi di dalam ekstensi ini, string akan diurai ke Lambda. Jadi saya pikir itu akan berhasil jika kita akan mengurai Lambda menjadi string dan memberikannya ke metode OrderBy. Dan berhasil!
sumber
sumber
Berikut adalah sesuatu yang saya temukan untuk menangani Descending bersyarat. Anda dapat menggabungkan ini dengan metode lain untuk menghasilkan
keySelector
fungsi secara dinamis.Pemakaian:
Perhatikan bahwa ini memungkinkan Anda untuk merantai
.OrderBy
ekstensi ini dengan parameter baru ke IQuerable.sumber
Hal ini tidak memungkinkan Anda lulus
string
, seperti yang Anda minta dalam pertanyaan, tetapi mungkin masih berhasil untuk Anda.The
OrderByDescending
Metode mengambilFunc<TSource, TKey>
, sehingga Anda dapat menulis ulang fungsi Anda dengan cara ini:Ada kelebihan lain untuk
OrderByDescending
juga yang mengambil aExpression<Func<TSource, TKey>>
, dan / atau aIComparer<TKey>
. Anda juga bisa melihat ke dalamnya dan melihat apakah mereka memberi Anda sesuatu yang berguna.sumber
Satu-satunya solusi yang berhasil untuk saya diposting di sini https://gist.github.com/neoGeneva/1878868 oleh neoGeneva.
Saya akan memposting ulang kodenya karena berfungsi dengan baik dan saya tidak ingin kode itu hilang di interwebs!
sumber
Tambahkan paket nugget Dynamite ke kode Anda
Tambahkan namespace Dynamite.Extensions Misalnya: using Dynamite.Extensions;
Berikan Urutan berdasarkan kueri seperti kueri SQL apa pun Misalnya: students.OrderBy ("City DESC, Address"). ToList ();
sumber
Untuk memperluas respon @Icarus: jika Anda ingin mengurutkan berdasarkan dua bidang saya dapat melakukan fungsi berikut (untuk satu bidang respon Icarius bekerja dengan sangat baik).
Ini adalah fungsi yang dikembalikan tubuh untuk ekspresi lambda, ini berfungsi dengan string dan int, tetapi cukup untuk menambahkan lebih banyak tipe agar berfungsi sesuai dengan kebutuhan setiap programmer
untuk menggunakannya, berikut ini dilakukan
jika ada cara yang lebih baik untuk melakukan ini, alangkah baiknya jika mereka membagikannya
Saya berhasil menyelesaikannya berkat: Bagaimana cara membuat ekspresi lambda properti berganda dengan LINQ
sumber
Saya terlambat ke pesta tetapi tidak ada solusi yang berhasil untuk saya. Saya sangat ingin mencoba System.Linq.Dynamic, tetapi saya tidak dapat menemukannya di Nuget, mungkin terdepresiasi? Bagaimanapun juga ...
Berikut adalah solusi yang saya dapatkan. Saya perlu secara dinamis menggunakan campuran OrderBy , OrderByDescending dan OrderBy> ThenBy .
Saya hanya membuat metode ekstensi untuk objek daftar saya, sedikit hacky saya tahu ... Saya tidak akan merekomendasikan ini jika itu adalah sesuatu yang sering saya lakukan, tetapi bagus untuk satu kali.
sumber