2009-05-26 20 views
2

私はDateTimeフィールドを持つテーブルとint型のフィールドを持っていると言うと、このようなクエリを実行できます。LinqToSqlのサブクエリは、親と同じ順序であることが保証されていますか?

var query = context.tblSomeTable.Where(s=>s.Name == "Hello World").OrderBy(s=>s.SignUpDate); 

私は、結果を持つ2つのサブクエリを実行した場合、彼らはまだ、日付順に並んでい?:

var sub1 = query.Where(s=>s.Id = 5); 
var sub2 = query.Where(s=>s.Id = 8); 

私のガットはまだ順番に並んでいますが、元のクエリがまだ反復/実行されているかどうかは問題ですか?

答えて

7

はい、「まだ」注文されていると言っても間違いです。彼らは最後に一度注文されます。

LinqtoSqlについて重要なことは、単にを使用して実行されるクエリを作成することだけです。表示された例では、まだ実際にクエリを使用していません。

select * from tblSomeTable s 
where s.Name = 'Hello World' and s.ID == @p1 
order by s.SignUpDate 

あなたがSUB1使用する場合は、@ p1は5

(実際には、 'Hello Worldの' に設定されます:あなたは彼らがこのSQL文を生成します両方の二つの大きなクエリに

を構築してきました)同様にパラメータとして渡されます...)

+0

これは、SQL Server Profilerを使用して非常に簡単にテストできます。 LINQクエリを作成するコードにブレークポイントを置き、プロファイラを見ながら各行を実行します。クエリがデータベースにヒットするタイミングを正確に知ることができます。これはクエリをデバッグするのにも役立ちます。なぜなら、クエリを表示してプロファイラから取得できるからです。 – Jagd

+0

ドキュメントには、By By節が最後にプッシュバックされることが実際に書かれていますか? L2Sは通常、「合理的なことをしようとしている」という事実を考えれば、私はそれをすべきだと思うだろうが、もし言及されていなければ、それに依存せず、最後まであなたの「順序」を動かす... –

+0

SQL文は、クエリが実際に使用されたとき(foreach文の場合や.ToList()コールなど)に1回だけ実行されます –

1

はい、それでも同じ順序です。あなたのケースの最初のクエリは、IOrderedQueryableになります。さらにそれをクエリすると、sub1とsub2もIOrderedQueryableになり、したがって順序が維持されます。

関連する問題