Maison >développement back-end >C++ >Comment implémenter le tri générique des colonnes de chaînes avec OrderBy d'IQueryable ?

Comment implémenter le tri générique des colonnes de chaînes avec OrderBy d'IQueryable ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-14 10:14:46644parcourir

How to Implement Generic String Column Sorting with IQueryable's OrderBy?

Étendez OrderBy pour utiliser des paramètres génériques pour le tri des colonnes de chaînes

Comment trier IQueryable en utilisant les noms de colonnes de chaîne dans la méthode d'extension générique ? Notre méthode existante ApplySortFilter<T, TResult> présente des défauts car elle nécessite de spécifier le type de OrderBy au moment de l'exécution, ce qui n'est pas réalisable.

Question :

<code class="language-c#">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
    var param = Expression.Parameter(typeof(T), "o");
    var body = Expression.PropertyOrField(param, columnName);

    var sortExpression = Expression.Lambda(body, param);
    return query.OrderBy(sortExpression);
}</code>

Solution :

Pour surmonter cette limitation, nous devons déduire le type de OrderBy à partir de sortExpression. Voici une implémentation modifiée :

<code class="language-c#">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

Cette méthode modifiée déduit dynamiquement le type de la propriété commandée et applique correctement l'opération OrderBy.

Instructions de tri par ordre décroissant :

Pour le tri décroissant, remplacez simplement "OrderBy" par "OrderByDescending" dans MethodCallExpression.

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