Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Pengisihan Lajur Rentetan Generik dengan OrderBy IQueryable?

Bagaimana untuk Melaksanakan Pengisihan Lajur Rentetan Generik dengan OrderBy IQueryable?

Susan Sarandon
Susan Sarandonasal
2025-01-14 10:14:46677semak imbas

How to Implement Generic String Column Sorting with IQueryable's OrderBy?

Lanjutkan OrderBy untuk menggunakan parameter generik untuk pengisihan lajur rentetan

Bagaimana untuk mengisih IQueryable menggunakan nama lajur rentetan dalam kaedah sambungan generik? Kaedah sedia ada kami ApplySortFilter<T, TResult> mempunyai kekurangan kerana ia memerlukan penetapan jenis OrderBy pada masa jalan, yang tidak boleh dilaksanakan.

Soalan:

<code class="language-c#">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
    var param = Expression.Parameter(typeof(T), "o");
    var body = Expression.PropertyOrField(param, columnName);

    var sortExpression = Expression.Lambda(body, param);
    return query.OrderBy(sortExpression);
}</code>

Penyelesaian:

Untuk mengatasi had ini, kita perlu membuat kesimpulan jenis OrderBy daripada sortExpression. Berikut ialah pelaksanaan yang diubah suai:

<code class="language-c#">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

Kaedah yang diubah suai ini secara dinamik menyimpulkan jenis sifat yang dipesan dan menggunakan operasi OrderBy dengan betul.

Arahan untuk mengisih dalam tertib menurun:

Untuk pengisihan menurun, cuma gantikan "OrderBy" dengan "OrderByDescending" dalam MethodCallExpression.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengisihan Lajur Rentetan Generik dengan OrderBy IQueryable?. 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