Как linq-to-sql генерирует sql для псевдозапросов коллекций? - PullRequest
0 голосов
/ 27 августа 2009

Насколько я понимаю, псевдоязык LinqToSql описывает набор с использованием синтаксиса, очень похожего на SQL, и это позволит вам эффективно обновить свойство коллекции объектов:

from b in BugsCollection where b.status = 'closed' set b.status = 'open' 

Это обновит базовую базу данных, используя только один оператор SQL.

Обычно ORM необходимо перетянуть все строки в отдельные объекты, обновить атрибуты каждого из них и сохранить их по отдельности в базе данных (по крайней мере, в моем понимании).

Итак, как linq-to-sql избегает этого, когда другие формы не могут этого избежать?

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Синтаксис, указанный в вашем вопросе, неверен. LINQ не имеет побочных эффектов; это язык запросов. Правильный способ выполнить то, что вы ищете, это

var x = from b in dataContext.BugsCollection where b.status == "closed";
foreach (var y in x)
y.status = "open";

dataContext.SubmitChanges();

Это сгенерирует единственный оператор SQL, о котором вы говорите. Причина, по которой он в состоянии это сделать, заключается в отложенном выполнении - движок L2S фактически не общается с базой данных, пока не должен - в этом случае, потому что был вызван метод SubmitChanges (). Затем L2S отправляет сгенерированный оператор SQL в базу данных для выполнения.

1 голос
/ 27 августа 2009

Поскольку LINQ to SQL использует Деревья выражений для преобразования вашего синтаксиса запроса в фактический SQL ... он затем выполняет SQL для базы данных (вместо того, чтобы извлекать все данные, выполняя их в оперативной памяти) данные, а затем записать изменения обратно в базу данных).

Например, следующий синтаксис запроса:

var records = from r in Records
              where r.Property == value
              select r

Сначала переводится в синтаксис Lamda:

Records.Where(r => r.Property == value).Select();

И, наконец, к SQL (через Деревья выражений ):

SELECT Property, Property2, Property3 FROM Record WHERE Property = @value

... предоставлено, пример ничего не обновляет ... но для запроса на обновление процесс будет таким же, как и для простого выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...