Avant l’arrivée de LINQ, le tri dynamique consistait en la concaténation de bout de SQL dans une requête. Question sécurité ce n’était pas la meilleure des solutions car cela ouvrai la porte à des attaques par injection de SQL.

Avec LINQ, la sécurité contre les injection SQL est résolue. Maintenant voyons un exemple de tri dynamique en LINQ :

Prenons un exemple simple : un datagrid avec un tri sur les entêtes de colonnes.

Le DataSource est définit par une collection d’objets. Bien que cela simplifie l’affichage des objets, il retire aussi la capacité du tri automatique de la grille. Pour remédier à cela, il est possible de mettre du code dans l’événement ColumnHeaderMouseClick pour trier la grille.

La solution de facilité serai de faire cela pour toutes les colonnes avec un code spécifique par colonne mais cela implique une modification à chaque changement dans la grille.

Heureusement chaque colonne de la grille contient le nom de la propriété de l’objet qu’elle doit afficher. Ceci permet de faire le tri dynamique.

La première étape consiste à retrouver une instance de l’objet à afficher depuis la collection (factures dans cet exemple) :

Facture facture = factures.First();

Ensuite nous retrouvons la propriété avec son nom et le PropertyInfo (dans le namespace System.Reflection) :

PropertyInfo prop = facture.GetType().GetProperties().First(pr => pr.Name == propertyName);

Maintenant que l’on a retrouvé l’objet PropertyInfo de la propriété, nous l’utilisons pour faire le tri :

factures = factures.OrderBy(f => prop.GetValue(f, null)).ToList();