0

在哪种情况下,linq-to-sql查询中没有显式排序返回项目没有按主键排序?什么时候sql查询的隐式顺序不是主键

(我知道,SQL语句不具有隐含的顺序,并得到一个定义的顺序正确的做法是明确设置)

如: 给定一个SQL数据库的表parent,和表children

表父具有字段:

  • ID(INT,主键,自动值,聚集的索引)
  • 名称(VARCHAR)

表儿童具有字段:

  • ID(INT,主键,自动值,聚集的索引)
  • 的parentID(INT ,非聚簇索引的外键)
  • 名称(varchar)

与LINQ到SQL通过以下方式获得:据我所知,LINQ到SQL只是在后台执行一个select xy from Children Where parentID=123

var parent = dc.Parent.First(p=>p.ID==123); 
... 
foreach (var child in parent.Children) 
    Console.WriteLine(child.ID) 

,但我不知道是否有一些额外的缓存之间

在哪些情况下child.IDs不会按升序排序?

如果我要保证顺序,要做到这一点是正确的做法是明显
foreach (var child in parent.Children.OrderBy(c=>c.ID);
我意识到,如果没有一个明确的排序依据的顺序是正式定义,并且可以不依赖于任何隐含的排序。

但是我有一些代码直到现在还没有使用明确的顺序,直到最近通过了所有的测试,但现在偶尔会失败,我只是对原因感到好奇。

+2

“我知道SQL语句没有隐式顺序,并且获得已定义顺序的正确方法是明确设置它” - 那么为什么要问一个试图建立隐式顺序的问题? “......我只是对原因感到好奇。” - 您已经确定了原因 - 您在需要时未能指定订单。 –

+0

我以为我的意图非常清楚:我已经建立了正确的修复,但我仍然对sql-server和linq-to-sql的内部工作感到好奇。 – HugoRune

+0

每天,在您上班的路上,您都停在一组红绿灯处,以另一种方式来等待,是一辆红色的汽车,一辆黄色的汽车和一辆货车。今天早上,他们是黄色的汽车,红色的汽车和一辆绿色的SUV。可能有很多原因,他们为什么不按照他们通常的顺序,并且你已经意识到你没有权力*期望*他们按照特定的顺序... –

回答

0

发生了什么事情可能是因为子表中数据的选择性发生了变化。这导致表中统计信息的变化,这将是数据突然变化的顺序的解释。你很幸运,它碰巧按照你以前想要的顺序排序,但保证某个顺序的唯一方法是使用显式的ORDER BY语句。

+0

对不起,我不太明白。子表中数据选择性的变化意味着什么? – HugoRune

+1

我不太确定除了“数据的选择性”以外还有其他描述。引擎使用统计信息(其中包含关于行的选择性(即值的唯一性)等信息)。它使用这些统计数据来找出检索数据的最佳方式。如果统计信息因数据更改而发生更改,则订单可能会因此而更改。 我已经看到它发生之前,它可以在一夜之间改变,有点像你所描述的。 – SchmitzIT