J'ai une requête de IQueryable et je veux y appliquer un tri dynamiquement, le tri peut être sur plusieurs colonnes (asc ou desc). J'ai écrit la fonction générique suivante:LINQ: Tri dynamique sur plusieurs colonnes
private IQueryable<T> ApplySorting<T,U>(IQueryable<T> query, Expression<Func<T, U>> predicate, SortOrder order)
{
if (order == SortOrder.Ascending)
{
{
return query.OrderBy<T, U>(predicate);
}
}
else
{
{
return query.OrderByDescending<T, U>(predicate);
}
}
}
SortOrder est mon simple, ENUM avec 2 valeurs: ascendant et descendant
J'appelle cette fonction dans une boucle, pour chaque colonne que l'utilisateur a demandé le tri. Cependant j'ai remarqué qu'il échoue parce qu'il trie toujours sur la dernière colonne utilisée, en ignorant les autres.
Je trouve qu'il ya une méthode « ThenBy » sur IOrderedQueryable si l'usage est valide:
var q = db.MyType.OrderBy(x=>x.Col1).ThenBy(y=>y.Col2); //etc.
Mais comment puis-je faire générique? J'ai essayé de tester si la requête est IOrderedQueryable mais elle semble toujours être vraie même si c'est la plus simple var q = de x dans db.MyType select x
Je n'ai aucune idée pourquoi il a été conçu comme ceci. Quel est le problème avec:
var q = db.MyType.OrderBy(x=>x.Col1).OrderBy(y=>y.Col2); //etc.
il est tellement intuitive
Je suppose qu'ils ne laissent pas .OrderBy (.. Col1 ..). OrderBy (.. Col2 ..) la mouche est parce qu'ils sont pas de bonne façon de savoir si le résultat final est destiné à commander par Col1, puis réorganiser la liste entière par Col2; ou Col1 puis un sous-ordre de Col2 (comme vous le vouliez) –
L'exécution de la requête est différée, lorsque vous écrivez .OrderBy rien ne se passe tant que vous n'avez pas parcouru l'ensemble de requêtes pour la première fois. – PawelRoman