2009-08-27 4 views
0

Я понимаю, что pseudolanguage LinqToSql описывает набор, используя синтаксис очень похож на SQL, и это позволит вам эффективно обновлять свойство на коллекции объектов:Как linq-to-sql генерирует sql для сбора псевдо-запросов?

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

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

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

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

ответ

1

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

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

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

получает переведенный первым в Lamda Синтаксис:

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

И, наконец, SQL (через Expression Trees):

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

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

2

Синтаксис, указанный в вашем вопросе, неверен. 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 в базу данных для выполнения.

+0

y.status = "open"; –

+0

исправлено. Спасибо, Майк! –

Смежные вопросы