如何使用NULL将DataTable按2列排序,可能使用LINQ?

时间:2009-10-30 17:35:03

标签: c# linq sorting datatable

我有一个ADO.Net数据表,我需要首先按column1然后按column2排序,其中任何一个都可能有空值。排序后,我需要从行中读取一些值并添加到列表视图中。

我已编写代码来执行此DataTable.DefaultView.Sort(运行两次)。但想知道是否有更好的方法。

我在想LINQ ......所以我试过了:

OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field<int?>("column1"))
            .ThenBy(c => c.Field<int?>("column2"));

"System.InvalidCastException was unhandled"出现此错误。我假设这是由NULL引起的,所以就像我在数据表"where column1 IS NOT NULL"上指定查询的测试一样,错误仍然发生。

我的LINQ经验并不多,所以我的问题是:

  • 上面的代码有什么不对?从概念上讲,我错过了LINQ的工作原理吗?
  • 为什么过滤掉Null仍会导致这种情况?再说一次,从概念上讲,我错过了LINQ的工作方式
  • 是否有更好的\正确的LINQ查询?
  • 是否有更好的\更正确(更优雅)的方式(使用LINQ或不使用LINQ)?

TEP

2 个答案:

答案 0 :(得分:10)

如果您有DataTable,请查看DataView

private void SortByTwoColumns()
{
    // Get the DefaultViewManager of a DataTable.
    DataView view = DataTable1.DefaultView;

    // By default, the first column sorted ascending.
    view.Sort = "State, ZipCode DESC";
}

来源: http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

答案 1 :(得分:0)

Not sure what the datatypes are for those columns, I'm assuming they are int
but if your database is Oracle, try the following:

OrderedEnumerableRowCollection queryX = dt.AsEnumerable() .OrderBy(c => c.Field<decimal?>("column1")) .ThenBy(c => c.Field<decimal?>("column2"));