2009-05-23 5 views
0

Есть ли у кого-нибудь представление о том, как запустить следующий оператор с LINQ?Обновления LINQ to SQL

UPDATE FileEntity SET DateDeleted = GETDATE() WHERE ID IN (1,2,3) 

Я пришел как любовь и ненависть LINQ, но до сих пор было мало, что не работал хорошо. Очевидным решением, которое я хочу избежать, является перечислить все сущности файлов и установить их вручную.

foreach (var file in db.FileEntities.Where(x => ids.Contains(x.ID))) 
{ 
    file.DateDeleted = DateTime.Now; 
} 
db.SubmitChanges(); 

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

Я думаю, некоторые выражения запроса поставщика вещь, что привело бы к выше T-SQL ...

ответ

2

LINQ не могут выполнять в обновлениях магазина - это интегрированный язык запросов, не обновлять. Большинство (возможно, даже всех) OR mappers будут генерировать оператор select для извлечения данных, изменения его в памяти и выполнения обновления с помощью отдельного оператора обновления. Карты Smart OR получат только первичный ключ до тех пор, пока не потребуются дополнительные данные, но тогда они обычно будут получать весь остаток, потому что было бы дорого стоить только один атрибут сразу.

Если вы действительно заботитесь об этой оптимизации, используйте хранимую процедуру или написанную вручную инструкцию SQL. Если вам нужен код компакта, вы можете использовать следующее.

db.FileEntities. 
    Where(x => ids.Contains(x.ID)). 
    Select(x => x.DateDeleted = DateTime.Now; return x;); 

db.SubmitChanges(); 

Мне это не нравится, потому что я считаю его менее читаемым, но некоторые предпочитают такое решение.

0

LINQ to SQL - это ORM, как и любой другой, и, как таковой, он не предназначен для обработки массовых обновлений/вставки/удаления. Общая идея с L2S, EF, NHibernate, LLBLGen и остальным заключается в том, чтобы обрабатывать отображение реляционных данных на ваши графы объектов для вас, устраняя необходимость управления большой библиотекой хранимых процедур, что в конечном итоге ограничивает гибкость и адаптивность.

Когда дело доходит до массовых обновлений, им лучше всего оставить то, что делает их лучше всего ... сервером базы данных. L2S и EF обеспечивают возможность сопоставления хранимых процедур с вашей моделью, что позволяет сохранять сохраненные процессы в некоторой сущности. Поскольку вы используете L2S, просто напишите proc, который принимает набор идентификаторов в качестве ввода, и выполняет инструкцию SQL в начале вашего вопроса. Перетащите этот сохраненный proc на вашу модель L2S и вызовите его.

Это лучшее решение проблемы, которая является массовым обновлением. Подобно отчетам, графы объектов и объектно-реляционное сопоставление не являются лучшим решением для массовых процессов.