一般的な列名を使用して IQueryable の OrderBy メソッドを拡張します
この記事では、指定された文字列列名に基づいて並べ替えできるように、汎用拡張メソッドを使用して IQueryable を拡張する方法について説明します。
次の拡張メソッドを検討してください:
<code class="language-csharp">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName) where T : EntityObject</code>
並べ替え関数を実装するには、指定された列名を使用して式を作成する必要があります。ただし、問題が発生しました。式から推論された順序付けタイプが、OrderBy メソッドで必要なタイプと一致しませんでした。
ソートタイプ TSortColumn
は実行時にのみ決定できるため、これには課題があります。ただし、解決策はあります。
提供されているコード例は、同様のアプローチを示しています。
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)</code>
このメソッドは、列名を表す文字列パラメーター ordering
を受け入れます。指定された列名とラムダ式に基づいて式を動的に生成します。次に、結果の式を使用して、OrderBy メソッドを呼び出す MethodCallExpression
を作成します。
最後に、source.Provider.CreateQuery<T>
が呼び出され、ソートされた IQueryable が返されます。
変更: 降順ソートの場合:
<code class="language-csharp">MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));</code>
以上が一般的な列名を使用して IQueryable の OrderBy を拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。