首頁 >後端開發 >C++ >如何使用字串列名在 IQueryable 上實現動態排序的通用擴充方法?

如何使用字串列名在 IQueryable 上實現動態排序的通用擴充方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-14 09:45:43876瀏覽

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

使用字串列名對 IQueryable 進行動態排序的泛型擴充方法

本文探討如何實作一個泛型擴充方法 ApplySortFilter,允許使用字串列名對 IQueryable 集合進行動態排序。核心問題在於如何在運行時為 OrderBy 方法指定正確的類型。

初始嘗試

最初的實作嘗試從 sortExpression 推論 OrderBy 表達式的類型,如下所示:

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>

然而,TSortColumn 只能動態決定,使得這種方法不可行。

可行方案

在一個類似的 LINQ to SQL 專案中,找到了一個解決方案:

<code class="language-csharp">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;

    // 确定排序方向
    if (ordering.StartsWith("-"))
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }
    else
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }

    // 创建并返回查询
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

使用方法

要使用此方法,您可以將要排序的列名指定為字串:

<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>

這將產生一個按 Name 列升序排序的查詢。

This revised output provides a more concise and technically accurate description of the code and its purpose, while maintaining the original image. The formatting is also improved for readability.

以上是如何使用字串列名在 IQueryable 上實現動態排序的通用擴充方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn