用于排序问题的动态LINQ帮助

用于排序问题的动态LINQ帮助,linq,linq-to-sql,sorting,dynamic,predicate,Linq,Linq To Sql,Sorting,Dynamic,Predicate,我有一个简单的有序对象的IEnumerable集合。我想编写一个通用排序函数,它接受集合和对应于Order对象上的属性的sortkey。我不想硬编码每个属性的排序说明。我如何构建一个动态LINQ字符串来自动为我生成LINQ?以下是我的SortOrders()函数的当前状态: public IEnumerable<Order> SortOrders(IEnumerable<Order> orders, string sortKey) {

我有一个简单的有序对象的IEnumerable集合。我想编写一个通用排序函数,它接受集合和对应于Order对象上的属性的sortkey。我不想硬编码每个属性的排序说明。我如何构建一个动态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 "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);

可以将要排序的表达式作为Lamba传递(这是简化/伪代码)

排序器(IEnumerable orders,Func-Func)
{
sortedOrders=orders.OrderBy(func)
....                
}
//电话:
排序器(订单,o=>o.CustomerID);
您可以使用,不需要扩展方法。只需在DynamicQueryable类中使用扩展名,并将键和方向都指定为字符串

var sorted = orders.OrderBy( "CustomerID desc" );

这让我走了一半。。。如何动态生成函数调用本身?换句话说,如果Order对象有N个属性,我希望能够动态地组装“o=>o.OrderPropertyName”部分。我不想硬编码o=>o.CustomerID。谢谢你对这个问题感兴趣。如果你想让它完全动态,看看另一个答案。请务必意识到,您不需要对用于排序的lambda进行“硬编码”。您可以像传递任何变量一样传递它。
var sorted = orders.OrderBy( "CustomerID desc" );