Массовое обновление с LINQ to SQL - PullRequest
7 голосов
/ 25 августа 2011

Есть ли способ выполнить массовое обновление коллекции с помощью LINQ?В настоящее время, если у меня есть List<myObject>, и я хочу обновить column1 равным TEST для каждой строки в списке, я бы настроил цикл foreach, а затем для каждого отдельного объекта я бы установил значение и затем сохранил его.Это прекрасно работает, но мне просто интересно, есть ли какой-нибудь метод LINQ, где я мог бы сделать что-то вроде myOject.BulkUpdate(columnName, value)?

Ответы [ 3 ]

10 голосов
/ 08 августа 2012

Ваше требование здесь вполне возможно при использовании выражений Linq и превосходной библиотеки Терри Ани по этой теме.

Пакетное обновление и удаление с помощью LINQ to SQL

Обновление в терминах приведенного вами примера будет следующим:

using BTR.Core.Linq;
...

Context.myObjects.UpdateBatch
(
    Context.myObjects.Where(x => x.columnName != value),
    x => new myObject { columnName = value}
);

Редактировать (2017-01-20): это ничего не стоит, теперь это доступно в виде пакета NuGet @ https://www.nuget.org/packages/LinqPost/.

Install-Package LinqPost
5 голосов
/ 25 августа 2011

Звучит так, как будто вы используете LINQ To SQL, и вы уже изложили основы.

LINQ To SQL - это абстрагирование таблиц в классы, и на самом деле они не предоставляют искомую «серебряную пулю» или однострочник.

Единственный способ сделать это - добиться однострочного исполнения - создать сохраненный процесс, который будет принимать имя столбца и новое значение, и самостоятельно реализовать эту логику.

 db.MassUpdateTableColumn("Customer", "Name", "TEST");

 ....
 CREATE PROC MassUpdateTableColumn
    @TableName varchar(100), @ColumnName varchar(100), @NewVal varchar(100)
 AS
    /*your dynamic SQL to update a table column with a new val. */

В противном случае, как вы описываете:

 List<Customer> myCusts = db.Customers.ToList();
 foreach(Customer c in myCusts)
 {
     c.Name = "TEST";
 }     
 db.SubmitChanges();
1 голос
/ 26 августа 2011

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

В тех случаях, когда вам не нужно увлажнять весь объект на клиенте, гораздо лучше использовать операции на стороне сервера (хранимые процедуры, TSQL) вместо LINQ. Вы можете использовать поставщиков LINQ для выдачи TSQL для базы данных. Например, с LINQ to SQL вы можете использовать context.ExecuteCommand («Обновить поле набора таблицы = значение, где условие»), просто следите за SQL-инъекцией .

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