【问题标题】:Dynamic LINQ help for sorting problem排序问题的动态 LINQ 帮助
【发布时间】:2011-04-28 06:10:32
【问题描述】:

我有一个简单的 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 "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);

【问题讨论】:

    标签: linq linq-to-sql sorting dynamic predicate


    【解决方案1】:

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

    SortOrders(IEnumerable<Order> orders, Func<Order, string> func)
    {
        sortedOrders = orders.OrderBy(func) 
        ....                
    }
    
    
    // call:
    SortOrders(orders,  o => o.CustomerID);
    

    【讨论】:

    • 这让我走到了一半...如何动态生成函数调用本身?换句话说,如果 Order 对象有 N 个属性,我希望能够动态地组装“o => o.OrderPropertyName”部分。我不想硬编码 o => o.CustomerID。感谢您对这个问题感兴趣。
    • 好的。如果您希望它完全动态,请查看其他答案。请意识到您不需要对用于排序的 lambda 进行“硬编码”。你可以像任何变量一样传递它。
    【解决方案2】:

    你可以使用Dynamic LINQ,不需要扩展方法。只需使用 DynamicQueryable 类中的扩展并将键和方向都指定为字符串。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多