1

LINQ2SQL を使用しています。(SQL プロファイラーで) LINQ が以下の LINQ に対して複数の選択ステートメントを生成していることに気付きました

var tableData = dataContext. テーブル名.ToList ();

SQL プロファイラーは、以下の DML ステートメントを 2 回表示します

TableNameからcolumnNamesを選択

これの理由は何ですか?

4

2 に答える 2

9

提示されたクエリは、 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
于 2011-01-31T12:08:13.243 に答える
6

SQL Server プロファイラーは、既定で次のイベントをサブスクライブします。

Audit Login
Audit Logout
Existing Connection
RPC:Completed
SQL:BatchCompleted
SQL:BatchStarting

SQL:BatchStartingこれらのデフォルト イベントでプロファイラーを開始すると、すべてのバッチ ステートメントがイベントとイベントのために 2 回繰り返されることがわかりSQL:BatchCompletedます。確認する価値があるというのはよくある誤解です。

于 2011-02-26T15:02:46.147 に答える