Comment spécifier l'argument transmis à l' orderby
aide d'une valeur que je prends comme paramètre?
Ex:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
Actuellement mise en œuvre:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
Au lieu de c.Address
, comment puis-je prendre cela comme paramètre?
Exemple
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
OrderBy
est une fonctionnalité Linq, et est activéeIEnumerable
, pas une fonctionnalité spécifique àList
. N'hésitez pas à annuler la modification ou à la modifier davantage :)Réponses:
Voici une possibilité d'utiliser la réflexion ...
la source
ThenBy
méthode .Vous pouvez utiliser un peu de réflexion pour construire l'arbre d'expression comme suit (il s'agit d'une méthode d'extension):
orderByProperty
est le nom de la propriété que vous souhaitezdesc
classer et s'il est passé à true comme paramètre pour , le tri sera par ordre décroissant; sinon, triera par ordre croissant.Vous devriez maintenant pouvoir faire
existingStudents.OrderBy("City",true);
ouexistingStudents.OrderBy("City",false);
la source
Pour développer la réponse de @Icarus : si vous voulez que le type de retour de la méthode d'extension soit un IOrderedQueryable au lieu d'un IQueryable, vous pouvez simplement convertir le résultat comme suit:
la source
1) Installez System.Linq.Dynamic
2) Ajoutez le code suivant
3) Écrivez votre commutateur pour sélectionner la fonction Lambda
4) Utilisez vos aides
5) Vous pouvez l'utiliser avec la pagination ( PagedList )
Explication
System.Linq.Dynamic nous permet de définir une valeur de chaîne dans la méthode OrderBy. Mais à l'intérieur de cette extension, la chaîne sera analysée en Lambda. J'ai donc pensé que cela fonctionnerait si nous analysions Lambda en chaîne et la donnions à la méthode OrderBy. Et il fonctionne!
la source
la source
Voici quelque chose que j'ai proposé pour traiter une descente conditionnelle. Vous pouvez combiner cela avec d'autres méthodes de génération
keySelector
dynamique de la fonction.Usage:
Notez que cela vous permet d'enchaîner cette
.OrderBy
extension avec un nouveau paramètre sur n'importe quel IQueryable.la source
Cela ne vous permet pas de passer un
string
, comme vous l'avez demandé dans votre question, mais cela peut toujours fonctionner pour vous.La
OrderByDescending
méthode prend unFunc<TSource, TKey>
, donc vous pouvez réécrire votre fonction de cette façon:Il existe également d'autres surcharges
OrderByDescending
qui prennent aExpression<Func<TSource, TKey>>
, et / ou aIComparer<TKey>
. Vous pouvez également les examiner et voir si elles vous fournissent quelque chose d'utile.la source
La seule solution qui a fonctionné pour moi a été publiée ici https://gist.github.com/neoGeneva/1878868 par neoGeneva.
Je republierai son code car il fonctionne bien et je ne voudrais pas qu'il soit perdu dans les interwebs!
la source
Ajoutez le package nugget Dynamite à votre code
Ajoutez l'espace de noms Dynamite.Extensions Ex: en utilisant Dynamite.Extensions;
Donner l'ordre par requête comme toute requête SQL Par exemple: étudiants.OrderBy ("Ville DESC, Adresse"). ToList ();
la source
Pour étendre la réponse de @Icarus: si vous voulez trier par deux champs, je pourrais effectuer la fonction suivante (pour un champ la réponse d'Icarius fonctionne très bien).
C'est la fonction que le corps renvoie pour l'expression lambda, cela fonctionne avec string et int, mais il suffit d'ajouter plus de types pour le faire fonctionner selon les besoins de chaque programmeur
pour l'utiliser, c'est fait
s'il y a une meilleure façon de le faire, ce serait formidable qu'ils le partagent
J'ai réussi à le résoudre grâce à: Comment puis-je créer une expression lambda à propriétés multiples avec Linq
la source
Je suis bien en retard à la fête mais aucune de ces solutions n'a fonctionné pour moi. J'avais hâte d'essayer System.Linq.Dynamic, mais je n'ai pas trouvé cela sur Nuget, peut-être déprécié? D'une manière ou d'une autre...
Voici une solution que j'ai trouvée. J'avais besoin d'utiliser dynamiquement un mélange de OrderBy , OrderByDescending et OrderBy> ThenBy .
J'ai simplement créé une méthode d'extension pour mon objet de liste, un peu hacky je sais ... Je ne recommanderais pas cela si c'était quelque chose que je faisais beaucoup, mais c'est bon pour un seul.
la source