Comment puis-je faire un Tri avec une dynamique de paramètre de chaîne?
Je veux faire ceci:
var orderBy = "Nome, Cognome desc";
var timb = time.Timbratures.Include("Anagrafica_Dipendente")
.Where(p => p.CodDipendente == 1);
if(orderBy != "")
timb = timb.OrderBy(orderBy);
Est-il un OrderBy
de surcharge disponible qui accepte un paramètre de chaîne?
- Double Possible de Comment puis-je spécifier le Linq OrderBy argument dynamiquement?
- Ici est la bonne réponse. Sans tiers des bibliothèques. stackoverflow.com/a/233505/714828
- pour entity framework, reportez-vous à ceci réponse (à l'aide de
EF.property<object>
)
Vous devez vous connecter pour publier un commentaire.
Absolument. Vous pouvez utiliser LINQ Requête Dynamique de la Bibliothèque, trouvé sur le blog de Scott Guthrie. Il y a également une version mise à jour disponible sur CodePlex.
Il vous permet de créer
OrderBy
clauses,Where
clauses, et à peu près tout le reste en passant en paramètres de la chaîne. Il fonctionne très bien pour la création de code générique pour le tri/filtrage des grilles, etc.OrderBy
champ? e.g.OrderBy("UserInput ascending").
Si vous utilisez de la plaine de LINQ-to-objets et ne veulent pas prendre une dépendance sur une bibliothèque externe, il n'est pas difficile d'obtenir ce que vous voulez.
La
OrderBy()
clause accepte unFunc<TSource, TKey>
qui obtient une sorte de clé à partir d'un élément source. Vous pouvez définir la fonction à l'extérieur de laOrderBy()
clause:Vous pouvez attribuer des valeurs différentes selon les critères de tri:
Alors vous pouvez trier:
Cet exemple suppose que le type de source est
Item
qui ont des propriétésName
etRank
.Notez que dans cet exemple
TKey
estObject
de ne pas contraindre les types de biens qui peuvent être triés sur. Si la fonction renvoie une valeur de type (commeInt32
), elle obtiendra la boîte lors du tri et qui est quelque peu inefficace. Si vous pouvez contraindreTKey
à un type de valeur spécifique, vous pouvez contourner ce problème.DateTime.Ticks
) vous pouvez annuler la valeur pour trier dans l'ordre inverse. Sinon, vous pouvez utiliserOrderBy
ouOrderByDescending
conditionnellement:var sortedItems = reverse ? items.OrderByDescending(orderByFunc) : items.OrderBy(orderByFunc)
.Une autre solution de codeConcussion (https://stackoverflow.com/a/7265394/2793768)
LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object, System.Object[])' method, and this method cannot be translated into a store expression.
Vous n'avez pas besoin d'une bibliothèque externe pour cela. Le code ci-dessous fonctionne pour LINQ to SQL/entités.
(
CreateExpression
copié à partir de https://stackoverflow.com/a/16208620/111438)Le plus simple & la meilleure solution:
IQueryable
.Oeil à ce blog ici. Il décrit une façon de le faire, par la définition d'un
EntitySorter<T>
.Il vous permet de passer dans un
IEntitySorter<T>
à votre service des méthodes et de l'utiliser comme ceci:Et vous pouvez créer un
EntitiySorter
comme ceci:Ou comme ceci:
Je l'ai fait:
Utilisation :
Travail comme:
Vous avez besoin d'utiliser LINQ Dynamique Requête de la Bibliothèque afin de passer des paramètres au moment de l'exécution,
Cela permettra linq des déclarations comme
Dans la réponse ci-dessus:
Le plus simple & la meilleure solution:
Il y a une erreur de syntaxe,
,null
doit être ajouté: