【问题标题】:C# sort table by 2 columnsC#按2列排序表
【发布时间】:2012-01-09 19:03:10
【问题描述】:

我有一个包含 CustomerName 和 Age 列的两列表。我有一个数据表中的所有数据。我想按年龄降序对其进行排序,然后每个年龄组按名称排序。因此,所有 30 岁的人都将按字母顺序排序,并介于 29 岁和 31 岁等人的列表之间。

我有:

string selectStatement = "Age";
string sortStatement = "Age DESC"

var rows = table.Select(selectStatement, sortStatement);

这应该按年龄排序。我还没有弄清楚如何按字母顺序对每个年龄组进行排序,但上面抛出了一个异常:

过滤器表达式“年龄”不计算为布尔项。

【问题讨论】:

    标签: c# select datatable sql-order-by


    【解决方案1】:

    DataView oDataSet; oDataSet.Tables[0].DefaultView.Sort = "Column1 ASC";

    【讨论】:

      【解决方案2】:

      过滤器 arg 可以作为 null 传递,因此不应用过滤器填充,并且在排序中您可以放置​​任意多的列,有/没有指定排序方向(默认为 asc)。 根据我的经验,在大型 DataTables 上,Select 比 LINQ 方法更快。

      【讨论】:

        【解决方案3】:

        就像@adrift 所说。您应该发送一个过滤器表达式(其计算结果为布尔值)作为第一个参数。尝试在那里发送 null 和一个空字符串,也许 Select 会忽略该参数。或者给它一些简单的表达式,比如 0

        但更好的是,您应该使用 DataView 类。像这样:

        var dt = new DataTable(); // your data.
        var view = new DataView(dt);
        view.Sort = "Age desc, Name asc";
        

        然后您可以将此类设置为某些控件等的数据源。它将以正确的顺序返回行。 或者您可以简单地使用 foreach 来遍历行。

        foreach (DataRowView dr in view)
        {
            //do what you like
        }
        

        【讨论】:

          【解决方案4】:

          选择和排序是两个不同的东西。

          你可以使用linq to dataset:

          var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")).
                                          ThenBy(row => row.Field<string>("Name"));
          

          【讨论】:

            【解决方案5】:

            您的 selectStatement 必须包含 过滤器表达式。看看this

            所以,你的 selectExpression 可能是

            string selectStatement = "Age > 0"; //if all people required
            

            【讨论】:

              【解决方案6】:

              那是因为DataTable.Select 方法是用于过滤的,而您的select 语句不像SQL Select。

              试试这个:

              table.DefaultView.Sort = "Age DESC";
              

              【讨论】:

                【解决方案7】:

                Select 的第一个参数应该是过滤器表达式,而不是要选择的列列表。

                【讨论】:

                  猜你喜欢
                  • 2011-10-29
                  • 2021-10-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-02-12
                  • 2017-07-21
                  • 2011-07-24
                  • 2012-10-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多