0

明示的な並べ替えを行わない linq-to-sql クエリで、主キーで並べ替えられていない項目が返されるのはどのような場合ですか?

(SQL ステートメントには暗黙的な順序がなく、定義された順序を取得する正しい方法は明示的に設定することであることを認識しています)

parent例: tableとtable を持つ SQL データベースがある場合children:

テーブルの親には次のフィールドがあります。

  • ID (int、主キー、自動値、クラスター化インデックス)
  • 名前(varchar)

Table Children には次のフィールドがあります。

  • ID (int、主キー、自動値、クラスター化インデックス)
  • parentID (int、非クラスター化インデックスを持つ外部キー)
  • 名前(varchar)

次の方法で linq-to-sql を使用してアクセスします。

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

私の知る限り、linq-to-sql は単にselect xy from Children Where parentID=123バックグラウンドで a を実行しますが、その間に追加のキャッシュがあるかどうかはわかりません

child.ID が昇順でソートされないのはどのような場合ですか?

順序を保証したい場合、これを行う正しい方法は明らか
foreach (var child in parent.Children.OrderBy(c=>c.ID);
に、明示的な OrderBy がないと順序が公式に定義されておらず、暗黙の順序付けに依存できないことを認識することです。

ただし、これまで明示的な順序を使用せず、最近まですべてのテストに合格していたコードがいくつかありますが、現在は失敗することがあり、その原因について単純に興味があります。

4

1 に答える 1

0

おそらく、子テーブルのデータの選択性が変わったのでしょう。これは、テーブルの統計の変更につながります。これは、データの順序が突然変更されることの説明になります。前に望んでいた順序でソートできたのは幸運でしたが、特定の順序を保証する唯一の方法は、明示的な ORDER BY ステートメントを使用することです。

于 2012-09-13T10:45:00.500 に答える