Maison >développement back-end >C++ >Comment trier dynamiquement IQueryable à l'aide d'un nom de colonne de chaîne ?

Comment trier dynamiquement IQueryable à l'aide d'un nom de colonne de chaîne ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-14 10:56:41934parcourir

How to Dynamically Order IQueryable Using a String Column Name?

OrderBy en utilisant le nom de la colonne de chaîne sur IQueryable dans la méthode d'extension générique

Lorsque vous utilisez OrderBy pour trier une requête, vous devez spécifier le type de l'expression de tri. Cependant, dans certains cas, le type peut ne pas être connu au moment de la compilation, ce qui rend difficile l'application du tri à l'aide de noms de colonnes de chaînes.

Pour surmonter ce problème, nous pouvons créer une méthode d'extension générique qui reçoit le nom de la colonne sous forme de chaîne et génère dynamiquement l'expression de tri basée sur la réflexion. Voici la version du code modifiée :

<code class="language-csharp">public static IQueryable<T> ApplySortFilter<T>(this IQueryable<T> query, string columnName)
{
    var type = typeof(T);
    var property = type.GetProperty(columnName);
    var parameter = Expression.Parameter(type, "o");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var sortExpression = Expression.Lambda(propertyAccess, parameter);
    return query.OrderBy(sortExpression);
}</code>

Ce code mis à jour utilise la réflexion pour récupérer les propriétés en fonction des noms de colonnes fournis, créant ainsi une expression de tri dynamique. Vous pouvez désormais l'utiliser comme suit :

<code class="language-csharp">var sortedQuery = query.ApplySortFilter("ColumnName");</code>

Où "ColumnName" est le nom de la colonne à trier.

Comme suggéré dans la réponse fournie, une autre approche consiste à utiliser une méthode d'extension personnalisée qui accepte le type et l'expression de tri comme paramètres :

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
    var type = typeof(T);
    // ... (其余代码与之前相同)
}</code>

Cette méthode peut être utilisée comme suit :

<code class="language-csharp">var sortedQuery = query.OrderBy<T>("ColumnName");</code>

En utilisant l'une ou l'autre de ces deux méthodes, vous pouvez appliquer dynamiquement un tri à un IQueryable en utilisant des noms de colonnes de chaîne, quel que soit le type sous-jacent.

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