首頁 > 後端開發 > C++ > 如何在' Iqueryable”和`ienumerable上實現動態Linq Orderby?

如何在' Iqueryable”和`ienumerable上實現動態Linq Orderby?

Patricia Arquette
發布: 2025-02-02 22:26:09
原創
977 人瀏覽過

How to Implement Dynamic LINQ OrderBy on `IQueryable` and `IEnumerable`?

IQueryable<T>IEnumerable<T>上使用動態LINQ OrderBy

在使用LINQ時,您經常對結果集進行排序。 LINQ提供OrderByOrderByDescending方法來實現此目的。但是,這些方法設計用於操作IQueryable<T>數據源,而不是IEnumerable<T>數據源。

要對IEnumerable<T>數據源進行排序,您需要首先使用AsQueryable方法將其轉換為IQueryable<T>,然後才能應用OrderByOrderByDescending方法。但是,轉換為IQueryable<T>並不總是可行或高效的。

IEnumerable<T>上實現OrderBy

以下代碼片段提供了IEnumerable<T>數據源的OrderByOrderByDescending方法的實現:

<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>
登入後複製

此實現將指定的屬性路徑拆分為單個屬性名稱,並使用反射生成一個表達式樹,該表達式樹可用於動態創建OrderByOrderByDescending表達式。

整合動態LINQ

為了進一步增強功能,您可以將此實現與動態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>
登入後複製

在此示例中,OrderByOrderByDescending方法採用動態數據源和屬性路徑作為輸入,並使用AccessorCache類為指定的屬性路徑動態生成屬性訪問器。 AccessorCache類提供高效的緩存和鎖定機制,以確保屬性訪問器僅創建一次。

此集成允許您在排序動態數據源時使用更具表達性的語法,從而更輕鬆地編寫涉及復雜屬性路徑的查詢。 需要注意的是,AccessorCache類的實現細節並未在原文中提供,需要自行實現或使用合適的第三方庫。 此外,原代碼中ApplyOrder方法不完整,需要補充完整的代碼邏輯才能實現動態排序功能。

以上是如何在' Iqueryable”和`ienumerable上實現動態Linq Orderby?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板