Скомпилированный запрос LINQ-to-SQL.Скомпилировать() с обновлением, удалить, вставить?

StackOverflow https://stackoverflow.com/questions/354245

  •  21-08-2019
  •  | 
  •  

Вопрос

Все,

Итак, я преобразовал все мои запросы select в LINQ-to-SQL в использование CompiledQueries для ускорения работы.До сих пор отлично работает для инструкций select, но я не смог понять, как предварительно скомпилировать инструкции insert, update или delete.

Конечно, когда вы вставляете, удаляете или обновляете в LINQ-to-SQL, вы должны использовать объектную модель.Но, очевидно, где-то на этом пути он генерирует запрос, который было бы неплохо предварительно скомпилировать и сохранить в статическом элементе.

Возможно ли это?Какова производительность LINQ для обновлений, удалений и вставок, если он не был предварительно скомпилирован?Я мог видеть, что это намного быстрее, чем selects , потому что то, что они делают внизу, намного проще и менее "динамично"...

Это было полезно?

Решение

Это большая разница.Запросы выбора Linq-To-SQL могут представлять собой большие сложные деревья выражений.Это то, что может потребовать некоторой "компиляции".В этом случае объединяется с некоторым T-SQL, который может быть запущен на сервере SQL.Поэтому имеет смысл кэшировать результат операции, чтобы его можно было использовать повторно.

Однако другие операции Удаления, обновления и вставки - это простые операции, которые не требуют преобразования дерева выражений в T-SQL (сам LINQ предназначен для выполнения запросов).К сожалению, нас научили думать о SQL-коде, который выполняет эти другие операции, как о "запросах", на самом деле мы не запрашиваем никакой информации.

Эти операции определяются только DataContext, а не LINQ, следовательно, код для выполнения этих функций уже скомпилирован.

Другие советы

Я думаю, что из трех только insert имело бы смысл иметь возможность компилировать и повторно использовать, потому что delete тривиально прост (УДАЛИТЬ ИЗ таблицы, ГДЕ Key ...), а UPDATE обновляет только те поля, которые были изменены, и поэтому зависит от операции обновления.

[)амьен

L2S использует "sp_executeSQL", поэтому после того, как вы запустите его в первый раз, он будет находиться в кэше плана выполнения хранимой процедуры.Последующие запуски (того же запроса - не с теми же параметрами) будут повторно использовать скомпилированный план из кэша.Итак, то, о чем вы просите, автоматически обрабатывается SQL Server "за кулисами".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top