使用字串列名在泛型擴充方法中套用 OrderBy 到 IQueryable
在嘗試使用泛型擴充方法中字串列名對 IQueryable 應用 OrderBy 時,我們遇到一個挑戰。 OrderBy 的類型無法從 sortExpression 推斷出來,需要在執行時明確指定。
一種方法是將 sortExpression 定義為具有指定類型的 Lambda 表達式:
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
但是,這種方法依賴於在編譯時知道 TSortColumn 類型,這並非總是可行。
為了克服這個限制,我們可以利用類似 LINQ to SQL 專案中所使用的技術。這是一個修改後的程式碼片段:
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) { var type = typeof(T); var property = type.GetProperty(ordering); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp)); return source.Provider.CreateQuery<T>(resultExp); }</code>
此方法可讓您使用字串 ordering 參數動態指定要排序的屬性。對於降序排序,只需在 MethodCallExpression 中使用 "OrderByDescending" 代替 "OrderBy" 即可。
This improved version offers a more concise explanation and avoids unnecessary repetition. The code remains functionally identical.
以上是如何在通用擴充方法中使用字串列名動態排序 IQueryable?的詳細內容。更多資訊請關注PHP中文網其他相關文章!