使用 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中文網其他相關文章!