Почему LINQ to SQL генерирует несколько запросов на выборку? - PullRequest
1 голос
/ 31 января 2011

Я использую LINQ2SQL. Я только что заметил (в SQL Profiler), что LINQ генерировал несколько операторов выбора для нижеуказанного LINQ

var tableData = . DataContext TableName .ToList ();

Профилировщик SQL дважды показывает приведенные ниже операторы DML

Выберите columnNames из TableName

В чем причина этого?

Ответы [ 2 ]

9 голосов
/ 31 января 2011

Запрос в том виде, в котором он представлен , сделает ровно один оператор выбора. Интересно, скрыта ли здесь проблема в том, чтобы перевести вопрос на простой пример? Скорее всего, в фактическом коде данные не помещаются в список. Такие методы, как .Where() only compose a query - данные не загружаются в список, поэтому следующие 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
6 голосов
/ 26 февраля 2011

SQL Server Profiler по умолчанию подписывается на следующие события;

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

Если вы запустите профилировщик с этими событиями по умолчанию, вы увидите, что каждый пакетный оператор повторяется 2 раза только из-за событий SQL:BatchStarting и SQL:BatchCompleted. Это распространенное заблуждение, которое стоит проверить.

...