0

そのように見えますが、この件に関する決定的な文書は見つかりません。

私が求めているのは、このクエリの結果:

from x
in Db.Items
join y in Db.Sales on x.Id equals y.ItemId
group x by x.Id into g
orderby g.Count() descending
select g.First()

次のクエリと常に同じです。

from x
in Db.Items
join y in Db.Sales on x.Id equals y.ItemId
group x by x.Id into g
select g.First()

2 番目のクエリでは、Linq がグループの順序を決定できることに注意してください。最初のクエリでは、グループの順序が販売数として設定されています。

私のアドホック テストでは、Linq がこの方法でグループを自動的に並べ替えることが示されているように見えますが、ドキュメントでは、その逆が真であることが示されているようです。項目は選択に表示される順序で返されます。このようにソートされている場合、余分なソートを追加しても意味がなく、サイクルが無駄になるため、省略したほうがよいでしょう。

4

3 に答える 3

4

sqlserver から返されるクエリ結果は、テストでは常に同じ順序になっているため、これが表示される可能性があります。ただし、これは誤りです。定義上、ORDER BY で明示的に指定しない限り、SQL のセットには順序がありません。したがって、クエリに order by ステートメントがない場合、セットは順序付けられているように見えるかもしれませんが、そうではなく、エッジ ケースでは順序が異なる可能性があります (たとえば、サーバーが次のページをロードする必要がある場合)。メモリの制約などにより、テーブルの順序が異なります)。経験則: 注文が必要な場合は、注文を指定する必要があります。

于 2009-05-24T16:41:15.070 に答える
1

LINQ グループ化は、そのようなことを保証しません。その特定の状況ではうまくいくかもしれませんが、別の状況ではうまくいかないかもしれません。この副作用に頼らないようにしてください

ちなみに、クラスター化されたインデックスなどのために出力が実際に SQL Server によって意図的に並べ替えられている場合、ORDER BY句を追加しても問題はありません。クエリ オプティマイザーは、結果が既に並べ替えられていることを認識できるほどスマートである必要があるため、失われることはありません。なんでも。

于 2009-05-24T16:41:22.573 に答える
1

仕様が順序付けを保証しない場合は、それが偶然であり、ソフトウェアの新しいバージョンで変更される可能性があると考えてください。

そして、そうでない限り、それを取り出さないでください

a)あなたはそれを測定しました、そしてそれは大きな違いをもたらします

b) ソフトウェア環境に小さな変更を加えるたびに、監視し、テストし、(どこでも) 元に戻す意思がある。

于 2009-05-24T16:42:25.133 に答える