2


1

「SELECT TOP {x}」クエリを使用したLINQ to SQLのパフォーマンス

LINQ-to-SQLでSELECT TOP 5と同等の実行方法を調べると、私が見たすべての答えは、.Take()を使用することをお勧めします。

var myObject = (
from myObjects in repository.GetAllMyObjects()
select myObject)
.Take(10);

私はまだLINQが舞台裏でどのように機能するかについてほとんど理解していませんが、Cのような言語を理解するためには、まずALLレコードを含む一時配列を割り当て、次に配列の最初の10要素をvarにコピーすることで解決します 小さなデータセットで作業している場合やパフォーマンスの制約がない場合は、このような問題はありませんが、たとえば、数百万のレコードを含む可能性のあるテーブルから最新の5つのログエントリを選択する場合は、ひどく効率が悪いようです。

これがどのように間違っているのか私の理解はありますか? もしそうなら、誰かが実際に何が起こるか説明できますか? それ以外の場合、LINQ-to-SQLを介してxレコードのみを選択するより良い(つまり、より効率的な)方法はありますか?

{空} [編集]

受け入れられた回答の提案に従って、LINQ-to-SQL出力をデバッグ出力に送信する架空のmyObjectクラスがあります。 ここからDebuggerWriterを使用することになりました:http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11

3 Answer


3


あなたの仮定は間違っています。 Linq to SQLでは、評価され、適切なSQLが生成される `Expression>`に評価されます。 すべてのレコードをロードすることを心配する必要はありません。

また、次の質問もご覧ください。 ストリームを「DataContext」に添付して、生成されたSQLを確認できます。 LINQ DataContext.SubmitChanges()からTSQLクエリを取得する方法


1


LINQは遅延実行を使用し、LINQ-to-SQLの場合は式ツリーを使用します。

`Take`呼び出しの結果を列挙するまでクエリは実行されないので、何も心配する必要はありません。


1


私はこの先週を通りました! devデータベースでSQLプロファイラーを開き、コードをステップ実行しました。 さまざまなクエリに対して生成されたSQLを見るのは非常に興味深いものでした。 私はあなたが同じことをすることを勧めます。 それはあなたの質問に対する正確な答えではないかもしれませんが、さまざまなコンポーネントが呼び出しの内容に応じてまったく異なるSQLステートメントを生成する方法を見るのは確かに啓発的でした。

MSDNで「遅延クエリの解決」または何か(?)の読書も啓発されると思います。