LINQ2SQL を使用しています。(SQL プロファイラーで) LINQ が以下の LINQ に対して複数の選択ステートメントを生成していることに気付きました
var tableData = dataContext. テーブル名.ToList ();
SQL プロファイラーは、以下の DML ステートメントを 2 回表示します
TableNameからcolumnNamesを選択
これの理由は何ですか?
LINQ2SQL を使用しています。(SQL プロファイラーで) LINQ が以下の LINQ に対して複数の選択ステートメントを生成していることに気付きました
var tableData = dataContext. テーブル名.ToList ();
SQL プロファイラーは、以下の DML ステートメントを 2 回表示します
TableNameからcolumnNamesを選択
これの理由は何ですか?
提示されたクエリは、 select ステートメントを 1 つだけ実行します。ここでの問題は、質問を簡単な例に移すことに隠されているのだろうか。ほとんどの場合、実際のコードでは、データをリストにプッシュしません。クエリを作成する.Where()
だけのようなメソッド-データをリストにロードしないため、次の2つのクエリがあります。
var tableData = dataContext.TableName.Where(row => row.Foo == bar);
foreach(var items in tableData) {...}
foreach(var items in tableData) {...}
を追加する.ToList()
と、単一の TSQL クエリで強制的にメモリにバッファリングされます。リストに対する後続の列挙は、メモリ内で行われます (LINQ-to-Objects)。
もちろん、LINQ-to-SQL が実行しているものを非常に簡単にプロファイリングできます。
dataContext.Log = Console.Out; // or any other text-writer
SQL Server プロファイラーは、既定で次のイベントをサブスクライブします。
Audit Login
Audit Logout
Existing Connection
RPC:Completed
SQL:BatchCompleted
SQL:BatchStarting
SQL:BatchStarting
これらのデフォルト イベントでプロファイラーを開始すると、すべてのバッチ ステートメントがイベントとイベントのために 2 回繰り返されることがわかりSQL:BatchCompleted
ます。確認する価値があるというのはよくある誤解です。