首頁 > 後端開發 > C++ > 如何使用 IQueryable 的 OrderBy 實作通用字串列排序?

如何使用 IQueryable 的 OrderBy 實作通用字串列排序?

Susan Sarandon
發布: 2025-01-14 10:14:46
原創
644 人瀏覽過

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

擴充OrderBy,使用泛型參數進行字串列排序

如何在泛型擴充方法中使用字串列名對IQueryable進行排序?我們現有的方法ApplySortFilter<T, TResult>存在不足,因為它需要在運行時指定OrderBy的類型,這是不可行的。

問題:

<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>
登入後複製

解:

為了克服這個限制,我們需要從sortExpression推論OrderBy的型別。這是一個修改後的實作:

<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>
登入後複製

這個修改後的方法動態地推斷被排序屬性的類型,並正確地應用OrderBy操作。

關於降序排序的說明:

對於降序排序,只需在MethodCallExpression中將「OrderBy」替換為「OrderByDescending」。

以上是如何使用 IQueryable 的 OrderBy 實作通用字串列排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板