2009-10-30 61 views
1

我有一个ADO.Net数据表,我需要首先按列1然后按列2排序,其中任何一个都可能有空值。一旦排序,我需要从行中读取一些值并添加到列表视图中。如何将DataTable按2列进行排序,使用NULL,可能使用LINQ?

我已经编写代码来完成这个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如何工作?
  • 为什么过滤掉空值仍然会导致这种情况?再一次,从概念上说,我错过了LINQ的工作原理
  • 有没有更好的\正确的LINQ查询呢?
  • 是否有更好的\正确(更优雅)的方式来做到这一点(使用LINQ或不)?

TEP

+1

你列1或列2不是int ? ...必须是问题,因为如果我的DataTable具有正确的类型,那么您的查询没有问题。请注意,你的列类型应该是int,而不是int?在列定义中,但应该是int?当您使用字段属性访问时,就像您一样。 – 2009-11-02 21:03:26

回答

10

如果你有一个数据表,看看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

+0

与此相关的两个问题... 1)当我这样做时,我把“column1 asc,column2 asc”我期望排序是由column1然后是column2,但它似乎是另一种方式。这是预期的吗? 2)是否有一个简单的方法来处理两列中的NULL? (也许这只是另一个StackOverflow问题) – 2009-10-30 21:29:09

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"));