Je joue autour et essayer de faire une méthode d'extension pour IQueryable qu'elle trie par une propriété arbitraire d'un objet.Réflexion avec IQueryable
public static class IQueryableExtender
{
public static IQueryable<TSource> Sort<TSource>(this IQueryable<TSource> query, string orderProperty, string sortDirection = "asc")
{
var elementType = query.ElementType;
var propertyInfo = elementType.GetProperty(orderProperty);
if (propertyInfo == null)
{
throw new ArgumentException(string.Format("{0} is not a property on {1}", orderProperty, elementType.Name));
}
switch (sortDirection.ToLower())
{
case "asc":
case "ascending":
return query.OrderBy(x => propertyInfo.GetValue(x, null));
break;
case "desc":
case "descending":
return query.OrderByDescending(x => propertyInfo.GetValue(x, null));
break;
}
return query;
}
}
Je reçois cette erreur lorsque j'appelle la méthode. Je suppose que cela a à voir avec le IQueryable n'a pas encore exécuté et récupéré des objets.
LINQ to Entities ne reconnaît pas la méthode System.Object GetValue(System.Object, System.Object[])
, et cette méthode ne peut pas être traduit en une expression de magasin.
Je peux le résoudre en exécutant ToList sur le IQueryable mais je récupère les données dans la méthode d'extension et ce n'est pas ce que je veux.
Est-ce que cela peut être résolu?
Merci pour la réponse. Ce n'est pas tout à fait ce que je cherche. J'ai laissé de côté le fait que je travaille avec MVC et que je reçois le nom de la propriété à trier par rapport à la vue. Donc je voulais une méthode où je pourrais juste prendre le paramètre et refléter la valeur de la propriété de l'objet et trier dessus. Ce qui signifierait que je n'ai besoin d'aucune instruction if pour choisir quelle propriété utiliser avec if. – Lejdholt
Cela fait un peu plus de sens. Ajouter AsEnumerable() avant d'utiliser OrderBy devrait le réparer. – Jesper
Je vais essayer. Merci – Lejdholt