Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan?

Bagaimana untuk Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan?

Susan Sarandon
Susan Sarandonasal
2025-01-14 10:56:41934semak imbas

How to Dynamically Order IQueryable Using a String Column Name?

PesanDengan menggunakan nama lajur rentetan pada IQueryable dalam kaedah sambungan generik

Apabila menggunakan OrderBy untuk mengisih pertanyaan, anda mesti menentukan jenis ungkapan isihan. Walau bagaimanapun, dalam beberapa kes jenis mungkin tidak diketahui pada masa penyusunan, menjadikannya mencabar untuk menggunakan pengisihan menggunakan nama lajur rentetan.

Untuk mengatasi masalah ini, kami boleh mencipta kaedah sambungan generik yang menerima nama lajur sebagai rentetan dan secara dinamik menjana ungkapan isihan berdasarkan pantulan. Berikut ialah versi kod yang diubah suai:

<code class="language-csharp">public static IQueryable<T> ApplySortFilter<T>(this IQueryable<T> query, string columnName)
{
    var type = typeof(T);
    var property = type.GetProperty(columnName);
    var parameter = Expression.Parameter(type, "o");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var sortExpression = Expression.Lambda(propertyAccess, parameter);
    return query.OrderBy(sortExpression);
}</code>

Kod yang dikemas kini ini menggunakan pantulan untuk mendapatkan semula sifat berdasarkan nama lajur yang disediakan, mencipta ungkapan isihan dinamik. Anda kini boleh menggunakannya seperti berikut:

<code class="language-csharp">var sortedQuery = query.ApplySortFilter("ColumnName");</code>

Di mana "ColumnName" ialah nama lajur yang hendak diisih.

Seperti yang dicadangkan dalam jawapan yang disediakan, pendekatan lain ialah menggunakan kaedah sambungan tersuai yang menerima jenis dan ungkapan pengisihan sebagai parameter:

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
    var type = typeof(T);
    // ... (其余代码与之前相同)
}</code>

Kaedah ini boleh digunakan seperti berikut:

<code class="language-csharp">var sortedQuery = query.OrderBy<T>("ColumnName");</code>

Dengan menggunakan salah satu daripada dua kaedah ini, anda boleh menggunakan pengisihan secara dinamik pada IQueryable menggunakan nama lajur rentetan, tanpa mengira jenis asas.

Atas ialah kandungan terperinci Bagaimana untuk Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan?. 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