Maison >développement back-end >C++ >Comment implémenter le tri générique des colonnes de chaînes avec OrderBy d'IQueryable ?
É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!