Linq en SQL: requête de sorting par nom de propriété arbitraire (colonne)

J’ai un problème plus vaste / complexe, mais pour simplifier, considérons les points suivants:

Disons que j’ai une table dans la base de données SQL appelée Product , qui a deux colonnes, ID (int, clé primaire) et Name (varchar / ssortingng) . J’ai aussi un simple LINQ DataContext .

J’ai une requête construite et remise à «ma» fonction. Disons que c’est quelque chose comme: (bien que cela puisse être un peu plus complexe)

IQueryable query = from p in db.Products select p; 

Une fois que ma méthode obtient cette requête, passée en paramètre, elle doit changer l’ordre de sorting, par exemple

 IQueryable sortedQuery = query.OrderBy(x => x.Name); 

Je voudrais rendre ce plus générique, c’est-à-dire spécifier le champ à sortinger. Normalement, je peux faire une instruction switch qui prend une chaîne. Cependant, j’aimerais savoir s’il existe un moyen de passer directement le paramètre. J’ai l’intention d’étendre cela à d’autres tables de firebase database, de sorte que ces instructions switch deviendraient fastidieuses.

J’essayais quelque chose comme:

 IQueryable sortedQuery = query.OrderBy(x => (typeof(Product)).GetProperty(“Name”)); 

Mais ça ne marche pas. Je veux également m’assurer que LINQ to SQL est maintenu, c’est-à-dire que le sorting doit être effectué sur le serveur SQL. Par conséquent, si je débogue, je devrais obtenir une requête SQL à partir de cette requête LINQ.

Merci d’avance pour votre aide.

Vous pouvez utiliser Dynamic Linq à cette fin.

Voir ici Dynamic LINQ (Partie 1: Utilisation de la bibliothèque de requêtes dynamics LINQ)

Ensuite, vous pouvez faire des appels comme ceci:

 var query = DBContext.Users.Where( "Age > 3" ).OrderBy( "Name asc" ); 

Essayez ceci à la place:

 query.OrderBy(x => x.GetType().GetProperty(“Name”).GetValue(x, null)); 

Vous ne pouvez pas simplement saisir la propriété. Vous devez récupérer la valeur de cette propriété, d’où l’appel à GetValue .

Ce n’est pas aussi facile qu’il y paraît. Le moteur LINQ to SQL parsing l’expression que vous transmettez à la méthode OrderBy afin d’obtenir le nom de la propriété que vous référencez, puis utilise ces informations pour composer une clause order by plain order by SQL.

Je suppose que peut-être que cela peut être fait en utilisant la reflection, de toute façon. Peut-être que vous pouvez obtenir quelque chose d’utile de la réponse acceptée à cette question SO .