2011-01-31 12 views
1

私はLINQ2SQLを使用しています。私はLINQはLINQLINQ to SQLが複数の選択クエリを生成するのはなぜですか?

以下

するvarたtableData = DataContextのための複数のSELECT文を生成していること(SQLプロファイラで)気づきました。 TableName .ToList();

SQLプロファイラは、DML文の下に示し倍

選択COLUMNNAMESこの理由は何

テーブル名 から?

+0

とあなたの質問は? – Bazzz

+1

@Miral:私はあなたの質問を実際の質問に編集するだけでなく、タグを編集する自由を取った。私が何かを誤解した場合は、それを見直して変更してください。 –

+1

実際にクエリを2回実行してもよろしいですか?最初は、準備または構文チェック(SET PARSEONLY) – Blorgbeard

答えて

9

が提示されているように、はselectステートメントを1つだけ実行します。質問を単純な例に移す際に、ここの問題が隠されているのだろうかと思います。実際にコードでは、データをリストにプッシュしません。 .Where()のような方法が唯一を構成クエリ - それは、リストにデータをロードしないので、次は2つのクエリです:メモリにバッファすることを強制します.ToList()を追加

var tableData = dataContext.TableName.Where(row => row.Foo == bar); 
foreach(var items in tableData) {...} 
foreach(var items in tableData) {...} 

単一のTSQLクエリ。その後の一覧の列挙はメモリ(LINQ-to-Objects)で行われます。もちろん

、あなたはかなり簡単に実行されているものLINQツーSQLプロファイリングすることができます

dataContext.Log = Console.Out; // or any other text-writer 
+0

私は彼が実際にやっていることだと思います。彼の問題は明らかに.ToList()メソッドがデータベースに2回呼び出しているということです。 – vtortola

+6

@vtortolaと私がレプロを見るとき、私は –

6

SQL Serverプロファイラは、デフォルトで以下のイベントをサブスクライブします。

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

あなたはすべてのバッチ文はちょうどのでSQL:BatchStartingSQL:BatchCompletedイベントの2回繰り返し参照これらのデフォルトのイベントでプロファイラを起動した場合。それはチェックする価値があることはよくある誤解です。

関連する問題