2011-01-31 3 views
1

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

вар tableData = DataContext. TableName .ToList();

SQL-профайлер показывает следующие утверждения DML в два раза

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

Что является причиной этого?

+0

и на ваш вопрос? – Bazzz

+1

@Miral: Я взял на себя смелость, чтобы изменить ваш вопрос на реальный вопрос, а также отредактировать теги. Пожалуйста, просмотрите его и измените, если я ничего не понял. –

+1

Вы действительно выполнили запрос дважды? Первый раз, возможно, был просто подготовкой или синтаксической проверкой (SET PARSEONLY) – Blorgbeard

ответ

9

как представлено будет выполнять только один оператор select. Интересно, скрывается ли проблема при перемещении вопроса на простой пример. Скорее всего, в коде он не перетаскивает данные в список. Такие методы, как .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 к SQL выполняется довольно просто:

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

Я думаю, что это то, что он делает на самом деле. Его проблема, по-видимому, в том, что метод .ToList() дважды вызывает базу данных. – vtortola

+6

@ vtortola, и когда я вижу репродукцию, я поверю, что –

6

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

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

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