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

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

Susan Sarandon
Libérer: 2025-01-10 12:35:42
original
350 Les gens l'ont consulté

How Can I Dynamically Specify the OrderBy Property in LINQ?

Spécifiez dynamiquement les paramètres LINQ OrderBy

En C#, la méthode OrderBy de LINQ permet de trier les données en fonction de propriétés ou d'expressions spécifiées. Mais comment spécifier dynamiquement la propriété ou l’expression à trier ?

Question :

Étant donné un paramètre, nous souhaitons trier la liste des étudiants en fonction de l'attribut spécifié, mais actuellement, le nom de l'attribut dans l'appel OrderBy est codé en dur.

Exemple :

<code class="language-csharp">List<Student> existingStudents = new List<Student> { new Student { ... }, new Student { ... } };
List<Student> orderByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>
Copier après la connexion

Cible :

Nous souhaitons prendre le nom de la propriété comme paramètre au lieu d'utiliser le nom de la propriété statique dans OrderBy.

Exemple :

<code class="language-csharp">string param = "City";
List<Student> orderByCity = existingStudents.OrderBy(c => c.City).ToList(); //仍然需要明确指定属性</code>
Copier après la connexion

Solution :

Grâce à la réflexion, nous pouvons construire dynamiquement une expression OrderBy :

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc)
{
    // ...  (反射代码构建表达式树) ...
    return source.Provider.CreateQuery<T>(resultExpression);
}</code>
Copier après la connexion

Vous pouvez ensuite trier dynamiquement selon les attributs spécifiés :

<code class="language-csharp">existingStudents.OrderBy("City", true); // 降序
existingStudents.OrderBy("City", false); // 升序</code>
Copier après la connexion

(Remarque : l'implémentation complète du code de réflexion est plus compliquée et est omise ici. Vous devez utiliser l'espace de noms System.Linq.Expressions pour créer l'arborescence d'expression et gérer les exceptions possibles, telles que les attributs qui n'existent pas.) Cette solution propose l'idée d'un tri dynamique. La mise en œuvre complète nécessite d'écrire du code plus robuste en fonction de la situation réelle. Utiliser c => param directement est une erreur, car cela ne triera que la chaîne de paramètres elle-même, pas les propriétés de l'objet étudiant. La réflexion doit être utilisée pour obtenir dynamiquement des propriétés et construire l’arborescence d’expression correcte.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal