Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ按2列对数据表进行排序,并使用空值?_C#_Linq - Fatal编程技术网

C# 如何使用LINQ按2列对数据表进行排序,并使用空值?

C# 如何使用LINQ按2列对数据表进行排序,并使用空值?,c#,linq,C#,Linq,我有一个ADO.Netdatatable,我需要先按column1排序,然后按column2排序,其中任何一个都可能有空值。排序后,我需要从行中读取一些值并添加到listview 我已经编写了执行此DataTable.DefaultView.Sort(运行两次)的代码。但是想知道是否有更好的方法 我在想也许LINQ…所以我试着: OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()

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

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

我在想也许LINQ…所以我试着:

OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field<int?>("column1"))
            .ThenBy(c => c.Field<int?>("column2"));
            
OrderedEnumerablerRowCollection queryX=dt.AsEnumerable()
.OrderBy(c=>c.Field(“column1”))
.ThenBy(c=>c.Field(“column2”);
但是,
“System.InvalidCastException”的此错误未得到处理“
。我假设这是由空值引起的,所以作为一个测试,我在datatable
“where column1 NOT NULL”
上指定了一个查询,错误仍然发生

我没有太多LINQ经验,所以我的问题是:

  • 我上面的代码有什么错误?从概念上讲,我缺少一些关于LINQ如何工作的信息
  • 为什么过滤掉空值仍然会导致这种情况?再一次,从概念上讲,我遗漏了一些关于LINQ如何工作的内容
  • 是否有更好的\正确的LINQ查询可以解决此问题
  • 是否有更好\正确(更优雅)的方法(使用LINQ或不使用LINQ)

tep

如果您有一个数据表,请查看:

资料来源:

如果您有数据表,请查看:

资料来源:

不确定这些列的数据类型是什么,我假设它们是int 但如果您的数据库是Oracle,请尝试以下操作:

OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field&lt;decimal?&gt;("column1"))
            .ThenBy(c => c.Field&lt;decimal?&gt;("column2"));
OrderedEnumerablerRowCollection queryX=dt.AsEnumerable()
.OrderBy(c=>c.Fielddecimal?(“第1列”))
.ThenBy(c=>c.Fielddecimal?(“第2列”);

不确定这些列的数据类型是什么,我假设它们是int 但如果您的数据库是Oracle,请尝试以下操作:

OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field&lt;decimal?&gt;("column1"))
            .ThenBy(c => c.Field&lt;decimal?&gt;("column2"));
OrderedEnumerablerRowCollection queryX=dt.AsEnumerable()
.OrderBy(c=>c.Fielddecimal?(“第1列”))
.ThenBy(c=>c.Fielddecimal?(“第2列”);

与此相关的两个问题……1)当我这样做时,我会说“column1 asc,column2 asc”,我希望排序是按column1然后按column2,但似乎是相反的。这是预期的吗?2) 有没有一种简单的方法来处理这两列中的NULL?(可能这只是另一个StackOverflow问题)两个与此相关的问题…1)当我这样做时,我会说“column1 asc,column2 asc”,我希望排序是按column1然后按column2,但似乎是另一种方式。这是预期的吗?2) 有没有一种简单的方法来处理这两列中的NULL?(可能这只是另一个StackOverflow问题)您的column1或column2不是int。。。这一定是问题所在,因为如果我的DataTable的类型正确,我对您的查询没有问题。请注意,列类型应该是int,而不是int?在列定义中,但应为int?当您使用Field属性进行访问时,您的column1或column2不是int。。。这一定是问题所在,因为如果我的DataTable的类型正确,我对您的查询没有问题。请注意,列类型应该是int,而不是int?在列定义中,但应为int?当您使用字段属性进行访问时,正如您所做的那样。