使用OrderBy動態排序LINQ結果
問題:
如何根據參數動態指定傳遞給OrderBy方法的參數?
詳情:
假設您有一個學生列表,並希望按特定屬性對其進行排序。目前實作使用硬編碼屬性名稱,但是如何將屬性名稱作為參數傳遞呢?
範例:
<code class="language-C#">string param = "City"; List<student> orderByAddress = existingStudents.OrderByDescending(c => param).ToList();</code>
解:
解決方案涉及使用反射動態建立表達式樹。可以建立一個擴充方法,如下所示:
<code class="language-C#">public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc) { string command = desc ? "OrderByDescending" : "OrderBy"; var type = typeof(TEntity); 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<TEntity>(resultExpression); }</code>
orderByProperty
參數表示屬性名稱,desc
決定排序順序。
用法:
現在,您可以動態排序學生清單:
<code class="language-C#">existingStudents.OrderBy("City", true); // 按城市降序排序 existingStudents.OrderBy("City", false); // 按城市升序排序</code>
以上是如何使用 OrderBy 動態排序 LINQ 結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!