OrderBy を使用して LINQ 結果を動的に並べ替えます
質問:
パラメータに基づいて OrderBy メソッドに渡されるパラメータを動的に指定するにはどうすればよいですか?
詳細:
学生のリストがあり、特定の属性で並べ替えたいとします。現在の実装ではハードコーディングされたプロパティ名が使用されていますが、プロパティ名をパラメータとして渡すにはどうすればよいですか?
例:
<code class="language-C#">string param = "City"; List<student> orderByAddress = existingStudents.OrderByDescending(c => param).ToList();</code>
解決策:
この解決策には、リフレクションを使用して式ツリーを動的に構築することが含まれます。拡張メソッドは次のように作成できます:
<code class="language-C#">public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc) { string command = desc ? "OrderByDescending" : "OrderBy"; var type = typeof(TEntity); var property = type.GetProperty(orderByProperty); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExpression = Expression.Lambda(propertyAccess, parameter); var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression)); return source.Provider.CreateQuery<TEntity>(resultExpression); }</code>
orderByProperty
パラメーターは属性名を表し、desc
は並べ替え順序を決定します。
使用法:
学生リストを動的に並べ替えることができるようになりました:
<code class="language-C#">existingStudents.OrderBy("City", true); // 按城市降序排序 existingStudents.OrderBy("City", false); // 按城市升序排序</code>
以上がOrderBy を使用して LINQ 結果を動的に並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。