ホームページ > バックエンド開発 > C++ > 汎用拡張メソッドで文字列列名を使用して IQueryable を動的に順序付けする方法

汎用拡張メソッドで文字列列名を使用して IQueryable を動的に順序付けする方法

Mary-Kate Olsen
リリース: 2025-01-14 07:17:42
オリジナル
319 人が閲覧しました

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

文字列列名を使用した汎用拡張メソッドで IQueryable

に OrderBy を適用する

汎用拡張メソッドで文字列列名を使用して OrderBy を IQueryable に適用しようとすると、問題が発生しました。 OrderBy の型は sortExpression から推測できないため、実行時に明示的に指定する必要があります。

1 つの方法は、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>
ログイン後にコピー

このメソッドを使用すると、文字列順序付けパラメーターを使用して並べ替えるプロパティを動的に指定できます。降順で並べ替えるには、MethodCallExpression で "OrderBy" の代わりに "OrderByDescending" を使用します。

この改善されたバージョンでは、より簡潔な説明が提供され、コードは機能的に同一のままです。

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

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