ホームページ > バックエンド開発 > C++ > IQueryable の OrderBy を使用して汎用文字列列の並べ替えを実装するにはどうすればよいですか?

IQueryable の OrderBy を使用して汎用文字列列の並べ替えを実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-14 10:14:46
オリジナル
643 人が閲覧しました

How to Implement Generic String Column Sorting with IQueryable's OrderBy?

文字列列の並べ替えに汎用パラメーターを使用するように OrderBy を拡張します

汎用拡張メソッドで文字列列名を使用して IQueryable を並べ替えるにはどうすればよいですか?既存のメソッド ApplySortFilter<T, TResult> には、実行時に OrderBy の型を指定する必要があるが、これは実現不可能であるため、欠点があります。

質問:

<code class="language-c#">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
    var param = Expression.Parameter(typeof(T), "o");
    var body = Expression.PropertyOrField(param, columnName);

    var sortExpression = Expression.Lambda(body, param);
    return query.OrderBy(sortExpression);
}</code>
ログイン後にコピー

解決策:

この制限を克服するには、sortExpression から OrderBy の型を推測する必要があります。変更された実装は次のとおりです:

<code class="language-c#">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>
ログイン後にコピー

この変更されたメソッドは、注文されるプロパティのタイプを動的に推論し、OrderBy 操作を正しく適用します。

降順で並べ替える手順:

降順で並べ替えるには、MethodCallExpression の "OrderBy" を "OrderByDescending" に置き換えるだけです。

以上がIQueryable の OrderBy を使用して汎用文字列列の並べ替えを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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