Saya menemukan contoh dalam VS2008 Contoh untuk Dynamic LINQ yang memungkinkan Anda untuk menggunakan string seperti sql (misalnya OrderBy("Name, Age DESC"))
untuk pemesanan. Sayangnya, metode yang disertakan hanya berfungsi IQueryable<T>
. Apakah ada cara untuk mengaktifkan fungsi ini IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
sumber
sumber
Jawaban:
Baru saja tersandung ke dalam ...
Untuk melakukan ini tanpa pustaka LINQ dinamis, Anda hanya perlu kode seperti di bawah ini. Ini mencakup sebagian besar skenario umum termasuk properti bersarang.
Untuk membuatnya bekerja dengan
IEnumerable<T>
Anda bisa menambahkan beberapa metode pembungkus yang masukAsQueryable
- tetapi kode di bawah ini adalahExpression
logika inti yang dibutuhkan.Sunting: semakin menyenangkan jika Anda ingin mencampurnya dengan
dynamic
- meskipun catatan yangdynamic
hanya berlaku untuk LINQ-to-Objects (pohon ekspresi untuk ORMs dll tidak dapat benar-benar mewakilidynamic
kueri -MemberExpression
tidak mendukungnya). Tapi inilah cara untuk melakukannya dengan LINQ-to-Objects. Perhatikan bahwa pilihanHashtable
ini karena semantik penguncian yang menguntungkan:sumber
IQueryable<T>
, jadi jika Anda memiliki sesuatu sepertiList<T>
(yangIEnumerable<T>
) Anda mungkin perlu menggunakanAsQueryable()
- misalnyavar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Terlalu mudah tanpa komplikasi:
using System.Linq.Dynamic;
di atas.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
sumber
System.Linq.Dynamic
?Saya menemukan jawabannya. Saya dapat menggunakan
.AsQueryable<>()
metode ekstensi untuk mengubah daftar saya menjadi IQueryable, kemudian menjalankan urutan dinamis dengan menentangnya.sumber
Baru saja menemukan pertanyaan ini.
Menggunakan implementasi ApplyOrder Marc dari atas, saya menampar bersama metode Extension yang menangani string seperti-SQL seperti:
Detail dapat ditemukan di sini: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
sumber
Saya kira itu akan berhasil menggunakan refleksi untuk mendapatkan properti apa pun yang ingin Anda urutkan:
Perhatikan bahwa menggunakan refleksi jauh lebih lambat daripada mengakses properti secara langsung, sehingga kinerjanya harus diselidiki.
sumber
Hanya membangun apa yang dikatakan orang lain. Saya menemukan bahwa berikut ini bekerja dengan cukup baik.
sumber
Saya telah menemukan pertanyaan ini untuk mencari beberapa klausa orderby Linq dan mungkin inilah yang dicari penulis
Berikut cara melakukannya:
sumber
Saya mencoba melakukan ini tetapi mengalami masalah dengan solusi Kjetil Watnedal karena saya tidak menggunakan sintaks LINQ inline - Saya lebih memilih sintaks metode-gaya. Masalah khusus saya adalah mencoba melakukan penyortiran dinamis menggunakan custom
IComparer
.Solusi saya berakhir seperti ini:
Diberi permintaan IQueryable seperti:
Dan diberi argumen semacam lapangan run-time:
OrderBy dinamis terlihat seperti ini:
Dan itu menggunakan metode pembantu kecil yang disebut GetReflectedPropertyValue ():
Satu hal terakhir - saya menyebutkan bahwa saya ingin
OrderBy
menggunakan kebiasaanIComparer
- karena saya ingin melakukan penyortiran alami .Untuk melakukan itu, saya hanya mengubah
OrderBy
ke:Lihat posting ini untuk mengetahui kodenya
NaturalSortComparer()
.sumber
Gunakan dinamis
linq
tambahkan saja
using System.Linq.Dynamic;
Dan gunakan seperti ini untuk memesan semua kolom Anda:
sumber
Anda bisa menambahkannya:
The
GetPropertyValue
fungsi dari jawaban Kjetil Watnedal iniMasalahnya adalah mengapa? Jenis apa pun akan membuang pengecualian pada waktu berjalan, daripada mengkompilasi waktu (seperti jawaban D2VIANT).
Jika Anda berurusan dengan Linq ke Sql dan orderby adalah pohon ekspresi itu akan dikonversi menjadi SQL untuk eksekusi.
sumber
OrderBy
jangan pertahankan pesanan sebelumnya !!Inilah sesuatu yang menurut saya menarik. Jika sumber Anda adalah DataTable, Anda dapat menggunakan penyortiran dinamis tanpa menggunakan Linq Dinamis
referensi: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Menggunakan DataSetExtensions)
Berikut ini satu cara lagi untuk melakukannya dengan mengubahnya menjadi DataView:
sumber
Terima kasih kepada Maarten ( Permintaan koleksi menggunakan objek PropertyInfo di LINQ ) saya mendapat solusi ini:
Dalam kasus saya, saya sedang mengerjakan "ColumnHeaderMouseClick" (WindowsForm) jadi baru saja menemukan Kolom khusus ditekan dan PropertyInfo korespondennya:
ATAU
(pastikan memiliki Nama kolom Anda yang cocok dengan properti Objek)
Bersulang
sumber
Setelah banyak pencarian, ini berhasil bagi saya:
sumber
Anda dapat mengonversi IEnumerable ke IQueryable.
sumber
Solusi alternatif menggunakan kelas / antarmuka berikut. Itu tidak benar-benar dinamis, tetapi berhasil.
sumber
Jawaban ini merupakan tanggapan terhadap komentar yang membutuhkan contoh untuk solusi yang disediakan oleh @John Sheehan - Runscope
dalam DAL (Lapisan Akses Data),
Versi IEnumerable:
Versi IQueryable
Sekarang Anda dapat menggunakan versi IQueryable untuk mengikat, misalnya GridView di Asp.net dan manfaat untuk menyortir (Anda tidak dapat menyortir menggunakan versi IEnumerable)
Saya menggunakan Dapper sebagai ORM dan membangun versi IQueryable dan menggunakan sorting di GridView di asp.net dengan sangat mudah.
sumber
Pertama Instal Alat Dinamis -> NuGet Package Manager -> Package Manager Console
Tambahkan Namespace
using System.Linq.Dynamic;
Sekarang kamu bisa menggunakannya
OrderBy("Name, Age DESC")
sumber
Anda bisa menggunakan ini:
sumber
Konversi Daftar ke IEnumerable atau Iquerable, tambahkan menggunakan namespace System.LINQ.Dynamic, maka Anda dapat menyebutkan nama properti dalam string yang dipisah koma ke Metode OrderBy yang datang secara default dari System.LINQ.Dynamic.
sumber
sumber