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
Mary-Kate Olsenoriginal
2025-01-14 09:45:43915parcourir

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>

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>

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>

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!

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