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 ?

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 ?

Mary-Kate Olsen
Libérer: 2025-01-14 09:45:43
original
918 Les gens l'ont consulté

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

Méthode d'extension générique pour trier dynamiquement 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.

Tentative initiale

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>
Copier après la connexion

Cependant, TSortColumn ne peut être déterminé que de manière dynamique, ce qui rend cette approche irréalisable.

Une solution ré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>
Copier après la connexion

Comment utiliser

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal