IQueryable<T>
和IEnumerable<T>
上使用動態LINQ OrderBy在使用LINQ時,您經常對結果集進行排序。 LINQ提供OrderBy
和OrderByDescending
方法來實現此目的。但是,這些方法設計用於操作IQueryable<T>
數據源,而不是IEnumerable<T>
數據源。
要對IEnumerable<T>
數據源進行排序,您需要首先使用AsQueryable
方法將其轉換為IQueryable<T>
,然後才能應用OrderBy
或OrderByDescending
方法。但是,轉換為IQueryable<T>
並不總是可行或高效的。
IEnumerable<T>
上實現OrderBy以下代碼片段提供了IEnumerable<T>
數據源的OrderBy
和OrderByDescending
方法的實現:
<code class="language-csharp">public static IOrderedEnumerable<T> OrderBy<T>( this IEnumerable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderBy"); } public static IOrderedEnumerable<T> OrderByDescending<T>( this IEnumerable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderByDescending"); } static IOrderedEnumerable<T> ApplyOrder<T>( IEnumerable<T> source, string property, string methodName) { // 此处省略部分代码,因为原代码不完整且存在错误,无法直接运行。需要补充完整的代码逻辑才能实现动态排序。 }</code>
此實現將指定的屬性路徑拆分為單個屬性名稱,並使用反射生成一個表達式樹,該表達式樹可用於動態創建OrderBy
或OrderByDescending
表達式。
為了進一步增強功能,您可以將此實現與動態LINQ集成,這允許您將排序表達式指定為類似SQL的字符串。這是一個示例:
<code class="language-csharp">public static IOrderedEnumerable<dynamic> OrderBy( this IEnumerable<dynamic> source, string property) { return Enumerable.OrderBy<dynamic>( source, AccessorCache.GetAccessor(property), Comparer<object>.Default); } public static IOrderedEnumerable<dynamic> OrderByDescending( this IEnumerable<dynamic> source, string property) { return Enumerable.OrderByDescending<dynamic>( source, AccessorCache.GetAccessor(property), Comparer<object>.Default); }</code>
在此示例中,OrderBy
和OrderByDescending
方法採用動態數據源和屬性路徑作為輸入,並使用AccessorCache
類為指定的屬性路徑動態生成屬性訪問器。 AccessorCache
類提供高效的緩存和鎖定機制,以確保屬性訪問器僅創建一次。
此集成允許您在排序動態數據源時使用更具表達性的語法,從而更輕鬆地編寫涉及復雜屬性路徑的查詢。 需要注意的是,AccessorCache
類的實現細節並未在原文中提供,需要自行實現或使用合適的第三方庫。 此外,原代碼中ApplyOrder
方法不完整,需要補充完整的代碼邏輯才能實現動態排序功能。
以上是如何在' Iqueryable”和`ienumerable上實現動態Linq Orderby?的詳細內容。更多資訊請關注PHP中文網其他相關文章!