J'ai une collection IEnumerable simple d'objets Order. Je veux écrire une fonction de tri générique qui accepte la collection et une clé de tri qui correspond à une propriété sur un objet Order. Je ne veux pas coder en dur les instructions de tri pour chaque propriété. Comment puis-je créer une chaîne LINQ dynamique qui génère automatiquement le LINQ pour moi? Voici ma fonction SortOrders() dans son état actuel:Aide LINQ dynamique pour le problème de tri
public IEnumerable<Order> SortOrders(IEnumerable<Order> orders, string sortKey)
{
// Sort order records
try
{
IEnumerable<Order> sortedOrders = new List<Order>();
// Extract sort key and direction from combined sortKey input
string _sortKey = this.SortKey.Replace(" ASC", "").Replace(" DESC", "");
bool sortASC = this.SortKey.EndsWith(" ASC");
switch (_sortKey)
{
case "CustomerID":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerID) : orders.OrderByDescending(o => o.CustomerID);
break;
case "CustomerAddress":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerAddress) : orders.OrderByDescending(o => o.CustomerAddress);
break;
case "CustomerCity":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerCity) : orders.OrderByDescending(o => o.CustomerCity);
break;
default:
sortedOrders = orders;
break;
}
return sortedOrders;
}
catch
{
return orders; // return original orders list in the event of errors
}
}
Je cherche à remplacer toutes les sections de cas comme celui-ci:
case "CustomerID":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerID) : orders.OrderByDescending(o => o.CustomerID);
avec une seule directive comme celui-ci:
sortedOrders = (sortASC) ? orders.OrderBy(o => o.PropertyName) : orders.OrderByDescending(o => o.PropertyName);
Ceci m'obtient à mi-chemin là ... Comment est-ce que je génère l'appel de fonction lui-même dynamiquement? En d'autres termes, si l'objet Order a N propriétés je veux être en mesure d'assembler la partie "o => o.OrderPropertyName" dynamiquement. Je ne veux pas avoir à coder en dur o => o.CustomerID. Merci de votre intérêt pour cette question. – Mark
OK. Si vous voulez qu'il soit complètement dynamique, regardez l'autre réponse. Réalisez que vous n'avez pas besoin de «coder en dur» le lambda que vous utilisez pour trier. Vous pouvez le transmettre comme n'importe quelle variable. –