114 votes

Comment spécifier dynamiquement l’argument Linq OrderBy ?

Comment spécifier l’argument passé à `` l’utilisation d’une valeur que je prends comme paramètre ?

ex:

Mise en œuvre actuelle :

Au lieu de `` , comment puis-je prendre cela comme paramètre?

exemple

156voto

Icarus Points 36951

Vous pouvez utiliser un peu de réflexion pour construire l’arborescence d’expression comme suit (il s’agit d’une méthode d’extension) :

est le nom de propriété que vous souhaitez trier et si vous passez true comme paramètre pour , triera dans l’ordre décroissant ; sinon, triera dans l’ordre croissant.

Maintenant, vous devriez être en mesure de faire ou

147voto

codeConcussion Points 7250

Voici une possibilité d’utiliser la réflexion...

14voto

Ciaran Points 64

Pour développer la réponse en @Icarus: si vous souhaitez que le type de retour de la méthode d’extension soit un IOrderedQueryable au lieu d’un IQueryable, vous pouvez simplement effectuer un cast du résultat comme suit :

6voto

user3440420 Points 11
   private Func<T, object> GetOrderByExpression<T>(string sortColumn)
    {
        Func<T, object> orderByExpr = null;
        if (!String.IsNullOrEmpty(sortColumn))
        {
            Type sponsorResultType = typeof(T);

            if (sponsorResultType.GetProperties().Any(prop => prop.Name == sortColumn))
            {
                System.Reflection.PropertyInfo pinfo = sponsorResultType.GetProperty(sortColumn);
                orderByExpr = (data => pinfo.GetValue(data, null));
            }
        }
        return orderByExpr;
    }

    public List<T> OrderByDir<T>(IEnumerable<T> source, string dir, Func<T, object> OrderByColumn)
    {
        return dir.ToUpper() == "ASC" ? source.OrderBy(OrderByColumn).ToList() : source.OrderByDescending(OrderByColumn).ToList();``
    }

 // Call the code like below
        var orderByExpression= GetOrderByExpression<SearchResultsType>(sort);

    var data = OrderByDir<SponsorSearchResults>(resultRecords, SortDirectionString, orderByExpression);    

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X