首頁 >後端開發 >C++ >如何使用字串列名動態排序 IQueryable?

如何使用字串列名動態排序 IQueryable?

Susan Sarandon
Susan Sarandon原創
2025-01-14 10:56:41937瀏覽

How to Dynamically Order IQueryable Using a String Column Name?

在泛型擴充方法中使用字串列名對 IQueryable 進行 OrderBy 排序

使用 OrderBy 對查詢進行排序時,必須指定排序表達式的類型。但是,在某些情況下,編譯時可能無法知道該類型,這使得使用字串列名應用排序變得具有挑戰性。

為了克服這個問題,我們可以建立一個泛型擴充方法,該方法接收列名作為字串,並基於反射動態產生排序表達式。以下是修改後的程式碼版本:

<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>

此更新後的程式碼使用反射根據提供的列名檢索屬性,從而建立動態排序表達式。現在您可以如下使用它:

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

其中,「ColumnName」是要排序的欄位的名稱。

正如提供的答案中所建議的那樣,另一種方法是使用一個自訂擴展方法,該方法接受類型和排序表達式作為參數:

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

此方法可以如下使用:

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

透過使用這兩種方法中的任何一種,您可以使用字串列名動態地對 IQueryable 應用排序,而不管底層類型是什麼。

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

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