Maison >développement back-end >C++ >Comment implémenter une méthode d'extension générique pour le tri dynamique sur IQueryable à l'aide de noms de colonnes de chaînes ?
Cet article explore comment implémenter une méthode d'extension générique ApplySortFilter
qui permet le tri dynamique d'une IQueryable
collection à l'aide de noms de colonnes de chaînes. Le problème principal est de savoir comment spécifier le type correct pour la méthode OrderBy
au moment de l'exécution.
L'implémentation d'origine tente de déduire le type de l'expression sortExpression
à partir de OrderBy
comme suit :
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Cependant, TSortColumn
ne peut être déterminé que de manière dynamique, ce qui rend cette approche irréalisable.
Dans un projet LINQ to SQL similaire, une solution a été trouvée :
<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; // 确定排序方向 if (ordering.StartsWith("-")) { resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp)); } else { resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp)); } // 创建并返回查询 return source.Provider.CreateQuery<T>(resultExp); }</code>
Pour utiliser cette méthode, vous spécifiez le nom de la colonne à trier sous forme de chaîne :
<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
Cela générera une requête triée par la colonne Nom par ordre croissant.
Cette sortie révisée fournit une description plus concise et techniquement précise du code et de son objectif, tout en conservant l'image d'origine. Le formatage est également amélioré pour plus de lisibilité.
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!