Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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结果以不同的顺序显示_C#_Linq_Linq To Sql_Linqpad - Fatal编程技术网

C# Linq结果以不同的顺序显示

C# Linq结果以不同的顺序显示,c#,linq,linq-to-sql,linqpad,C#,Linq,Linq To Sql,Linqpad,我目前正在处理AdventureWorks示例数据库和LinqPad,以获取一些想法 这就是问题所在: SalesOrderHeaders.GroupBy (soh => new {soh.CustomerID, soh.BillToAddressID}) .Where(soh => soh.Skip(1).Any()) .Dump(); 其想法是根据某些标准查找重复项,然后显示它们(第一组数据除外)。应将结果从表

我目前正在处理AdventureWorks示例数据库和LinqPad,以获取一些想法

这就是问题所在:

SalesOrderHeaders.GroupBy (soh => new {soh.CustomerID, soh.BillToAddressID})
                 .Where(soh => soh.Skip(1).Any())
                 .Dump();
其想法是根据某些标准查找重复项,然后显示它们(第一组数据除外)。应将结果从表中删除

执行查询后,我得到一个结果(A)

再次执行查询后,我得到结果B)

我不关心查询的正确结果,而是关心结果集的顺序。只有这两种可能性存在,并且它们在每次运行查询时交替出现。
当然我可以按键订购,但我更感兴趣的是为什么会出现这种情况?为什么顺序会改变/交替?

Sql server select查询的结果集顺序不确定。这就是sql server的工作方式,它在linq或linqpad中都不是一个bug。正如您自己所指出的,在查询中获得确定性结果的唯一方法是使用
OrderBy
子句


编辑:关于在SSMS中获得相同的结果如果多次运行查询,请参阅。这篇文章解释了为什么在多次执行查询时可能会得到相同的结果,以及为什么不应该依赖它。

Sql server select查询的结果集顺序是不确定的。这就是sql server的工作方式,它在linq或linqpad中都不是一个bug。正如您自己所指出的,在查询中获得确定性结果的唯一方法是使用
OrderBy
子句


编辑:关于在SSMS中获得相同的结果如果多次运行查询,请参阅。这篇文章解释了为什么在多次执行查询时可能会得到相同的结果,以及为什么不应该依赖它。

排序从来不像前面建议的那样是确定性的,但是尝试在sql查询或Linq查询中插入orderby子句,这是使其具有确定性的唯一方法

事实上,让我们在数据库中深入了解一下原因。DB将通过i/o从磁盘获取所有数据。数据存储在内部sql server结构中,如页面、范围、段(这些是Oracle数据块,我希望sql server具有类似的内容)。现在,当启动查询时,数据库将知道要从中获取数据的所有不同位置,但这不是一个串行操作,而是一种并行获取,不同的数据集组合在一起以提供用户视图。现在我们知道,在线程的情况下,谁先去谁先返回永远都不可能是确定的,这完全是线程的操作系统调度,希望能进一步澄清


OrderBy子句将处理以特定顺序生成的已获取数据,因此将始终产生确定性结果。

排序从来不像前面建议的那样具有确定性,但请尝试在sql查询或Linq查询中插入OrderBy子句,这是使其具有确定性的唯一方法

事实上,让我们在数据库中深入了解一下原因。DB将通过i/o从磁盘获取所有数据。数据存储在内部sql server结构中,如页面、数据块、数据段(这些是Oracle数据块,我希望sql server具有类似的功能)。现在,当启动查询时,数据库将知道要从中获取数据的所有不同位置,但这不是一个串行操作,而是一种并行获取,不同的数据集组合在一起以提供用户视图。现在我们知道,在线程的情况下,谁先去谁先返回永远都不可能是确定的,这完全是线程的操作系统调度,希望能进一步澄清


OrderBy子句将处理以特定顺序生成的获取数据,因此将始终产生确定性结果。

我刚刚找到了另一种解决方法。获取生成的SQL代码并在SSMS中执行。然后,设置顺序。但为什么会有两个不同的结果,而不是3、4或5?我相信SSMS在获取数据时会使用一些唯一的行id/数据id对数据进行内部排序,这就是为什么它能够为多次运行的每个select语句提供相同的行顺序。对于编程范例中通过提供者获取的数据,没有这样的内部排序。此外,订单数量将取决于您获取的行数,如果您有大量记录,您将看到更高的订单不确定性。获取生成的SQL代码并在SSMS中执行。然后,设置顺序。但为什么会有两个不同的结果,而不是3、4或5?我相信SSMS在获取数据时会使用一些唯一的行id/数据id对数据进行内部排序,这就是为什么它能够为多次运行的每个select语句提供相同的行顺序。对于编程范例中通过提供者获取的数据,没有这样的内部排序。此外,订单数量将取决于您获取的行数,如果您有大量记录,您将看到更高的订单不确定性。您的期望导致了一个普遍原则,即即使没有其他理由对呈现给用户的数据进行排序,也应对其进行排序,即使行之间没有任何逻辑排序。(当然,这不适用于像LINQPad和SSMS这样的开发工具。)您的期望导致了一个普遍原则,即即使没有其他理由对呈现给用户的数据进行排序,也应该对其进行排序,即使行之间没有任何逻辑排序。(当然,这不适用于像LINQPad和SSM这样的开发工具。)