首頁 >後端開發 >C++ >如何在LINQ中動態指定OrderBy欄位?

如何在LINQ中動態指定OrderBy欄位?

Susan Sarandon
Susan Sarandon原創
2025-01-10 11:21:42521瀏覽

How Can I Dynamically Specify the OrderBy Field in LINQ?

LINQ OrderBy 參數的動態指定

在需要動態指定 LINQ OrderBy 操作中所使用的欄位的場景中,可以使用反射技術來實現。

範例:

假設存在一個學生列表 existingStudents 和一個表示要排序的欄位的參數 param

<code class="language-csharp">List<student> existingStudents = new List<student> { ... };
string param = "City";</code>

標準實作:

預設方法使用硬編碼屬性名稱呼叫 OrderBy 進行排序:

<code class="language-csharp">List<student> orderedByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>

動態實作:

使用反射,可以建立一個動態表達式:

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc)
{
    // 确定排序表达式
    string command = desc ? "OrderByDescending" : "OrderBy";
    var type = typeof(T);
    var property = type.GetProperty(orderByProperty);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExpression = Expression.Lambda(propertyAccess, parameter);

    // 构建动态查询表达式
    var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType },
                                   source.Expression, Expression.Quote(orderByExpression));
    return source.Provider.CreateQuery<T>(resultExpression);
}</code>

使用方法:

現在可以使用 OrderBy 擴充方法按任何屬性動態排序:

<code class="language-csharp">List<student> orderbyAddress = existingStudents.OrderBy("City", true); // 降序
List<student> orderbyName = existingStudents.OrderBy("Name", false); // 升序</code>

以上是如何在LINQ中動態指定OrderBy欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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