Utilisez OrderBy pour trier dynamiquement les résultats LINQ
Question :
Comment spécifier dynamiquement les paramètres passés à la méthode OrderBy en fonction des paramètres ?
Détails :
Supposons que vous ayez une liste d'étudiants et que vous souhaitiez les trier selon un attribut spécifique. L'implémentation actuelle utilise des noms de propriétés codés en dur, mais comment transmettre les noms de propriétés en tant que paramètres ?
Exemple :
<code class="language-C#">string param = "City"; List<student> orderByAddress = existingStudents.OrderByDescending(c => param).ToList();</code>
Solution :
La solution consiste à construire dynamiquement des arbres d'expression en utilisant la réflexion. Une méthode d'extension peut être créée comme suit :
<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
représente le nom de l'attribut et desc
détermine l'ordre de tri.
Utilisation :
Vous pouvez désormais trier votre liste d'étudiants de manière dynamique :
<code class="language-C#">existingStudents.OrderBy("City", true); // 按城市降序排序 existingStudents.OrderBy("City", false); // 按城市升序排序</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!