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