J'ai trouvé un exemple dans les exemples VS2008 pour Dynamic LINQ qui vous permet d'utiliser une chaîne de type SQL (par exemple OrderBy("Name, Age DESC"))
pour la commande. Malheureusement, la méthode incluse ne fonctionne que sur IQueryable<T>
. Existe-t-il un moyen d'activer cette fonctionnalité IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
la source
la source
Réponses:
Je suis juste tombé sur ce vieil homme ...
Pour ce faire sans la bibliothèque dynamique LINQ, vous avez juste besoin du code ci-dessous. Cela couvre les scénarios les plus courants, y compris les propriétés imbriquées.
Pour le faire fonctionner,
IEnumerable<T>
vous pouvez ajouter des méthodes d'encapsulation qui passent parAsQueryable
- mais le code ci-dessous est laExpression
logique de base nécessaire.Edit: cela devient plus amusant si vous voulez mélanger cela avec
dynamic
- bien que notez que celadynamic
ne s'applique qu'aux LINQ-to-Objects (les arbres d'expression pour les ORM, etc. ne peuvent pas vraiment représenter lesdynamic
requêtes -MemberExpression
ne le supportent pas). Mais voici un moyen de le faire avec LINQ-to-Objects. Notez que le choix deHashtable
est dû à une sémantique de verrouillage favorable:la source
IQueryable<T>
, donc si vous avez quelque chose commeList<T>
(qui estIEnumerable<T>
), vous devrez peut-être utiliserAsQueryable()
- par exemplevar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Trop facile sans aucune complication:
using System.Linq.Dynamic;
en haut.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
la source
System.Linq.Dynamic
?J'ai trouvé la réponse. Je peux utiliser la
.AsQueryable<>()
méthode d'extension pour convertir ma liste en IQueryable, puis exécuter l'ordre dynamique par contre.la source
Je suis juste tombé sur cette question.
En utilisant l'implémentation ApplyOrder de Marc ci-dessus, j'ai giflé ensemble une méthode d'extension qui gère les chaînes de type SQL comme:
Les détails peuvent être trouvés ici: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
la source
Je suppose que cela fonctionnerait d'utiliser la réflexion pour obtenir la propriété que vous souhaitez trier:
Notez que l'utilisation de la réflexion est considérablement plus lente que l'accès direct à la propriété, de sorte que les performances doivent être étudiées.
la source
S'appuyant simplement sur ce que les autres ont dit. J'ai trouvé que ce qui suit fonctionne assez bien.
la source
J'ai trébuché sur cette question en recherchant des clauses de commande multiple de Linq et c'est peut-être ce que l'auteur recherchait
Voici comment procéder:
la source
J'essayais de le faire, mais j'avais des problèmes avec la solution de Kjetil Watnedal parce que je n'utilise pas la syntaxe linq en ligne - je préfère la syntaxe de style méthode. Mon problème spécifique était d'essayer de faire un tri dynamique à l'aide d'une coutume
IComparer
.Ma solution a fini comme ceci:
Étant donné une requête IQueryable comme ceci:
Et étant donné un argument de champ de tri au moment de l'exécution:
Le OrderBy dynamique ressemble à ceci:
Et cela utilise une petite méthode d'assistance appelée GetReflectedPropertyValue ():
Une dernière chose - j'ai mentionné que je voulais
OrderBy
utiliser la coutumeIComparer
- parce que je voulais faire un tri naturel .Pour ce faire, je modifie simplement le
OrderBy
pour:Voir cet article pour le code
NaturalSortComparer()
.la source
Utiliser dynamique
linq
Ajoutez simplement
using System.Linq.Dynamic;
Et utilisez-le comme ceci pour commander toutes vos colonnes:
la source
Vous pouvez l'ajouter:
La
GetPropertyValue
fonction est de la réponse de Kjetil WatnedalLa question serait pourquoi? Un tel tri lèverait des exceptions au moment de l'exécution, plutôt qu'au moment de la compilation (comme la réponse de D2VIANT).
Si vous avez affaire à Linq en Sql et que orderby est un arbre d'expression, il sera de toute façon converti en SQL pour exécution.
la source
OrderBy
ne maintenez pas la commande précédente !!Voici quelque chose d'autre que j'ai trouvé intéressant. Si votre source est un DataTable, vous pouvez utiliser le tri dynamique sans utiliser Dynamic Linq
référence: http://msdn.microsoft.com/en-us/library/bb669083.aspx (à l'aide de DataSetExtensions)
Voici une autre façon de le faire en le convertissant en DataView:
la source
Grâce à Maarten ( interroger une collection utilisant un objet PropertyInfo dans LINQ ), j'ai obtenu cette solution:
Dans mon cas, je travaillais sur un "ColumnHeaderMouseClick" (WindowsForm) alors je viens de trouver la colonne spécifique appuyée et son PropertyInfo correspondant:
OU
(assurez-vous que les noms de vos colonnes correspondent aux propriétés de l'objet)
À votre santé
la source
Après beaucoup de recherches, cela a fonctionné pour moi:
la source
Vous pouvez convertir IEnumerable en IQueryable.
la source
Une autre solution utilise la classe / interface suivante. Ce n'est pas vraiment dynamique, mais ça marche.
la source
Cette réponse est une réponse aux commentaires qui nécessitent un exemple de la solution fournie par @John Sheehan - Runscope
en DAL (Data Access Layer),
La version IEnumerable:
La version IQueryable
Vous pouvez maintenant utiliser la version IQueryable pour lier, par exemple GridView dans Asp.net et bénéficier du tri (vous ne pouvez pas trier en utilisant la version IEnumerable)
J'ai utilisé Dapper comme ORM et construit la version IQueryable et j'ai utilisé le tri dans GridView dans asp.net si facilement.
la source
Installez d'abord Dynamic Tools -> NuGet Package Manager -> Package Manager Console
Ajouter un espace de noms
using System.Linq.Dynamic;
Vous pouvez maintenant utiliser
OrderBy("Name, Age DESC")
la source
Vous pouvez utiliser ceci:
la source
Convertir la liste en IEnumerable ou Iquerable, ajouter en utilisant l'espace de noms System.LINQ.Dynamic, puis vous pouvez mentionner les noms de propriété dans une chaîne séparée par des virgules en méthode OrderBy qui vient par défaut de System.LINQ.Dynamic.
la source
la source