Динамическая LINQ помощь для решения проблемы сортировки - PullRequest
0 голосов
/ 20 октября 2010

У меня есть простая IEnumerable коллекция объектов Order.Я хочу написать общую функцию сортировки, которая принимает коллекцию, и клавишу сортировки, которая соответствует свойству объекта Order.Я не хочу жестко задавать инструкции сортировки для каждого свойства.Как я могу построить динамическую строку LINQ, которая автоматически генерирует LINQ для меня?Вот моя функция SortOrders () в ее текущем состоянии:

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
            }
        }

Я собираюсь заменить все секции case следующим образом:

case "CustomerID":
                        sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerID) : orders.OrderByDescending(o => o.CustomerID);

одной директивой, подобной этой:

sortedOrders = (sortASC) ? orders.OrderBy(o => o.PropertyName) : orders.OrderByDescending(o => o.PropertyName);

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Вы можете использовать Dynamic LINQ , и нет необходимости в методе расширения. Просто используйте расширение в классе DynamicQueryable и укажите ключ и направление в виде строки.

var sorted = orders.OrderBy( "CustomerID desc" );
1 голос
/ 20 октября 2010

Вы можете передать выражение, которое хотите отсортировать, как Lamba (это упрощенный / псевдокод)

SortOrders(IEnumerable<Order> orders, Func<Order, string> func)
{
    sortedOrders = orders.OrderBy(func) 
    ....                
}


// call:
SortOrders(orders,  o => o.CustomerID);
...