在泛型擴充方法中使用字串列名對 IQueryable 進行 OrderBy 排序
使用 OrderBy 對查詢進行排序時,必須指定排序表達式的類型。但是,在某些情況下,編譯時可能無法知道該類型,這使得使用字串列名應用排序變得具有挑戰性。
為了克服這個問題,我們可以建立一個泛型擴充方法,該方法接收列名作為字串,並基於反射動態產生排序表達式。以下是修改後的程式碼版本:
1 2 3 4 5 6 7 8 9 | <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>
|
登入後複製
此更新後的程式碼使用反射根據提供的列名檢索屬性,從而建立動態排序表達式。現在您可以如下使用它:
1 | <code class = "language-csharp" > var sortedQuery = query.ApplySortFilter( "ColumnName" );</code>
|
登入後複製
其中,「ColumnName」是要排序的欄位的名稱。
正如提供的答案中所建議的那樣,另一種方法是使用一個自訂擴展方法,該方法接受類型和排序表達式作為參數:
1 2 3 4 5 | <code class = "language-csharp" > public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
var type = typeof(T);
}</code>
|
登入後複製
此方法可以如下使用:
1 | <code class = "language-csharp" > var sortedQuery = query.OrderBy<T>( "ColumnName" );</code>
|
登入後複製
透過使用這兩種方法中的任何一種,您可以使用字串列名動態地對 IQueryable 應用排序,而不管底層類型是什麼。
以上是如何使用字串列名動態排序 IQueryable?的詳細內容。更多資訊請關注PHP中文網其他相關文章!