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 .