Maison >développement back-end >C++ >Comment puis-je spécifier dynamiquement la propriété Sort dans une clause LINQ OrderBy ?

Comment puis-je spécifier dynamiquement la propriété Sort dans une clause LINQ OrderBy ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 11:53:43642parcourir

How Can I Dynamically Specify the Sort Property in a LINQ OrderBy Clause?

Utilisez des paramètres dynamiques pour personnaliser les expressions OrderBy dans LINQ

La méthode d'extension OrderBy de LINQ vous permet de trier une collection d'objets en fonction d'une ou plusieurs propriétés. Mais comment spécifier quelles propriétés trier en utilisant les valeurs transmises en paramètres ?

Contexte :

Le code suivant montre l'utilisation de base de OrderBy, où les propriétés sont codées en dur :

<code class="language-csharp">List<student> existingStudends = new List<student>{ new Student {...}, new Student {...}};
List<student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();</code>

Spécification d'attribut dynamique :

Afin de spécifier dynamiquement les propriétés à trier, vous pouvez tirer parti de la réflexion pour créer l'arborescence d'expression nécessaire. Voici une méthode d'extension qui implémente cette fonctionnalité :

<code class="language-csharp">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 est le nom de la propriété que vous souhaitez trier et desc détermine s'il faut trier par ordre décroissant (vrai) ou croissant (faux).

Utilisation :

En utilisant cette méthode d'extension, vous pouvez désormais trier dynamiquement selon n'importe quel attribut :

<code class="language-csharp">string param = "City";
List<student> orderbyAddress = existingStudends.OrderBy("City", true).ToList(); // 按城市降序排序
List<student> orderbyName = existingStudends.OrderBy("Name", false).ToList(); // 按名称升序排序</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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn