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