【问题标题】:How to do the conditional order by with LINQ如何使用 LINQ 进行条件排序
【发布时间】:2015-07-19 12:45:01
【问题描述】:

我正在使用 linq 从 xml 文件中获取数据。这是我的代码。

XDocument document = XDocument.Load(@"c:\users\tridip\documents\visual studio 2010\Projects\WindowsFormsApplication5\WindowsFormsApplication5\Orders.xml");
            var books = from r in document.Descendants("Orders")
            .Skip(0)
            .Take(5)
            select new
            {
                OrderID = r.Element("OrderID").Value,
                CustomerID = r.Element("CustomerID").Value,
                EmployeeID = r.Element("EmployeeID").Value,
            };

          dataGridView1.DataSource=  books.ToList().OrderBy(a=> a.OrderID);

当我添加这一行 .OrderBy(a=> a.OrderID); 时,datagridview 不会显示任何数据。

所以我的问题是我们不能以这种方式添加 OrderBy books.ToList().OrderBy(a=> a.OrderID); 吗?

我的第二个问题是如何有条件地进行排序?

我将在某个时间向我的函数发送一个参数,例如ASC,或者某个时间DESC,如果我发送ASC,那么排序将按升序进行,或者有时会按降序进行。

所以请指导我如何编写代码来对我的数据进行一些时间升序或降序排序。谢谢

【问题讨论】:

  • books.ToList().OrderBy(a=> a.OrderID) 将导致两个枚举:立即枚举用于 ToList() 和惰性枚举用于 OrderBy()。您应该能够通过 books.OrderBy(a=> a.OrderID).ToList(); 获得有序列表;
  • 您是真的想对数据源进行排序,还是只想按排序顺序查看它。如果是后一种情况,可能使用 ICollectionView 是一个不错的选择。

标签: c# linq sorting


【解决方案1】:
books.ToList().OrderBy(a=> a.OrderID) 

将导致两个枚举:一个用于 ToList() 的立即枚举和一个用于 OrderBy() 的惰性枚举。您应该能够通过以下方式获得有序列表:

books.OrderBy(a=> a.OrderID).ToList();

【讨论】:

    【解决方案2】:

    条件排序很简单,因为“books”将是“IQueryable”的实现,直到您实际枚举它。因此,您可以这样做:

    if (true)
        books = books.OrderBy();
    
    var results = books.ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2021-06-30
      • 2012-01-28
      相关资源
      最近更新 更多