C#排序表由2列组成

时间:2011-11-30 14:47:27

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

我有一个包含CustomerName和Age列的两列表。我拥有DataTable中的所有数据。我希望通过降序Age来对其进行排序,然后按名称对每个年龄组进行排序。因此,所有30岁的人都将按照所有人的名义进行分类,并在29岁至31岁之间的人员名单之间等。

我有:

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

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

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

  

过滤器表达式'Age'不会计算为布尔项。

7 个答案:

答案 0 :(得分:4)

像@adrift说的那样。您应该将过滤器表达式(计算结果为boolean)作为第一个参数发送。尝试在那里发送null和一个空字符串,也许Select将忽略该参数。或者给它一些简单的表达,如0 <1。然后按部分顺序,你可以用逗号分隔几个字段:“Age Desc,Name”。

但更好的是,你应该使用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
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

选择和排序是两回事。

您可以使用linq to dataset

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

答案 3 :(得分:0)

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

试试这个:

table.DefaultView.Sort = "Age DESC";

答案 4 :(得分:0)

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

因此,您的selectExpression可能是

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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