この記事では、文字列列名を使用した ApplySortFilter
コレクションの動的並べ替えを可能にする汎用拡張メソッド IQueryable
を実装する方法について説明します。中心的な問題は、実行時に OrderBy
メソッドの正しい型を指定する方法です。
元の実装では、次のように sortExpression
から OrderBy
式の型を推論しようとします。
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
は動的にのみ決定できるため、このアプローチは現実的ではありません。 TSortColumn
<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>
この改訂された出力では、元のイメージを維持しながら、コードとその目的がより簡潔かつ技術的に正確に説明されています。
以上が文字列列名を使用して IQueryable で動的並べ替えのための汎用拡張メソッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。