使用動態參數自訂LINQ中的OrderBy表達式
LINQ 的 OrderBy 擴充方法可讓您根據一個或多個屬性對物件集合進行排序。但是,如何使用作為參數傳入的值來指定要排序的屬性呢?
背景:
以下程式碼展示了 OrderBy 的基本用法,其中屬性是硬編碼的:
<code class="language-csharp">List<student> existingStudends = new List<student>{ new Student {...}, new Student {...}}; List<student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();</code>
動態屬性指定:
為了動態指定要排序的屬性,您可以利用反射來建立必要的表達式樹。這是一個實作此功能的擴充方法:
<code class="language-csharp">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
決定是按降序 (true) 排序還是按升序 (false) 排序。
用法:
使用此擴充方法,您現在可以動態地按任何屬性排序:
<code class="language-csharp">string param = "City"; List<student> orderbyAddress = existingStudends.OrderBy("City", true).ToList(); // 按城市降序排序 List<student> orderbyName = existingStudends.OrderBy("Name", false).ToList(); // 按名称升序排序</code>
以上是如何在 LINQ OrderBy 子句中動態指定排序屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!