ホームページ > バックエンド開発 > C++ > 文字列列名を使用して IQueryable で動的並べ替えのための汎用拡張メソッドを実装する方法

文字列列名を使用して IQueryable で動的並べ替えのための汎用拡張メソッドを実装する方法

Mary-Kate Olsen
リリース: 2025-01-14 09:45:43
オリジナル
877 人が閲覧しました

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

文字列列名を使用して IQueryable を動的に並べ替えるための汎用拡張メソッド

この記事では、文字列列名を使用した ApplySortFilter コレクションの動的並べ替えを可能にする汎用拡張メソッド IQueryable を実装する方法について説明します。中心的な問題は、実行時に OrderBy メソッドの正しい型を指定する方法です。

最初の試み

元の実装では、次のように sortExpression から OrderBy 式の型を推論しようとします。

<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;

    // 确定排序方向
    if (ordering.StartsWith("-"))
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }
    else
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }

    // 创建并返回查询
    return source.Provider.CreateQuery<T>(resultExp);
}</code>
ログイン後にコピー
使用方法

このメソッドを使用するには、並べ替える列名を文字列として指定します。

<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
ログイン後にコピー
これにより、Name 列によって昇順に並べ替えられたクエリが生成されます。

この改訂された出力では、元のイメージを維持しながら、コードとその目的がより簡潔かつ技術的に正確に説明されています。

以上が文字列列名を使用して IQueryable で動的並べ替えのための汎用拡張メソッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート