Maison >développement back-end >C++ >Comment commander dynamiquement un IQueryable à l'aide d'un nom de colonne de chaîne dans une méthode d'extension générique ?

Comment commander dynamiquement un IQueryable à l'aide d'un nom de colonne de chaîne dans une méthode d'extension générique ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-14 07:17:42278parcourir

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

Appliquer OrderBy à IQueryable

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

Nous avons rencontré un défi en essayant d'appliquer OrderBy à un IQueryable en utilisant un nom de colonne de chaîne dans une méthode d'extension générique. Le type de OrderBy ne peut pas être déduit de sortExpression et doit être spécifié explicitement au moment de l'exécution.

Une solution consiste à définir sortExpression comme une expression Lambda d'un type spécifié :

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>

Cependant, cette approche repose sur la connaissance du type TSortColumn au moment de la compilation, ce qui n'est pas toujours possible.

Pour surmonter cette limitation, nous pouvons exploiter une technique similaire à celle utilisée dans le projet LINQ to SQL. Voici un extrait de code modifié :

<code class="language-csharp">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 vous permet de spécifier dynamiquement les propriétés à trier à l'aide du paramètre d'ordre des chaînes. Pour le tri décroissant, utilisez simplement « OrderByDescending » au lieu de « OrderBy » dans MethodCallExpression.

Cette version améliorée offre une explication plus concise et évite les répétitions inutiles. Le code reste fonctionnellement identique.

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