Linq To SQL: trier la requête par nom de propriété (colonne) arbitraire
J'ai un plus grand/plus de problème complexe, mais par souci de simplicité, considérons les éléments suivants:
Permettez-nous de dire que j'ai une table dans la Base de données SQL appelé Produitayant deux colonnes, ID (int, clé primaire) et Nom (varchar/chaîne). J'ai aussi un simple LINQ DataContext.
J'ai une requête construite et remis à “mon” de la fonction. Permettez-nous de dire que c'est quelque chose comme: (mais il peut être un peu plus complexe)
IQueryable<Product> query = from p in db.Products select p;
Une fois ma méthode reçoit cette requête, transmise en tant que paramètre, il a changer l'ordre de tri par exemple
IQueryable<Product> sortedQuery = query.OrderBy(x => x.Name);
Je voudrais faire plus générique, c'est à dire de préciser le domaine de tri. Normalement, je peux faire une switch
déclaration qui prend une chaîne de caractères. Cependant, je voudrais savoir si il existe un moyen de passer le paramètre directement. J'ai l'intention d'étendre à d'autres tables de Base de données, de sorte que ces switch
des déclarations serait fastidieux.
J'ai essayé quelque chose comme:
IQueryable<Product> sortedQuery = query.OrderBy(x => (typeof(Product)).GetProperty(“Name”));
Mais cela ne fonctionne pas. Je tiens également à s'assurer que le LINQ to SQL est maintenu à savoir le tri à faire sur le Serveur SQL. Donc si je debug, je devrais recevoir une requête SQL de cette requête LINQ.
Je vous remercie d'avance pour votre aide.
source d'informationauteur O.O.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
Dynamic Linq
à cette fin.Voir ici Dynamique LINQ (Partie 1: à l'Aide de LINQ Requête Dynamique de la Bibliothèque)
Alors vous pouvez faire des appels comme ceci:
Essayez ceci à la place:
Vous ne pouvez pas il suffit de saisir la propriété. Vous devez saisir la valeur de ce bien, d'où l'appel à
GetValue
.Il n'est pas aussi facile qu'il y paraît. Le LINQ to SQL moteur d'analyse de l'expression que vous passez à la
OrderBy
méthode afin d'obtenir le nom de la propriété que vous référencez, utilise ensuite cette information pour composer une plaine SQLorder by
clause.Je suppose que peut-être il peut être fait par l'utilisation de la réflexion, de toute façon. Peut-être que vous pouvez obtenir quelque chose d'utile à partir de la accepté de répondre à de cette SORTE de question.