2011-08-25 26 views
7

¿Hay alguna manera de hacer una actualización masiva en una colección con LINQ? Actualmente, si tengo un List<myObject> y quiero actualizar la columna 1 para que sea igual a PRUEBA para cada fila en la Lista, configuraría un ciclo foreach y luego, para cada objeto individual, establecería el valor y luego lo guardaría. Esto funciona bien, pero me preguntaba si había algún método LINQ que pudiera hacer algo como myOject.BulkUpdate(columnName, value).Actualización masiva con LINQ to SQL

+1

¿Estás hablando de LINQ to SQL? –

+0

Siempre volví a los procedimientos almacenados para realizar actualizaciones masivas utilizando XML como datos masivos, pero me gustaría saber si es posible en LINQ. –

Respuesta

5

Parece que está utilizando LINQ To SQL, y ya tiene los principios básicos establecidos.

LINQ To SQL se trata de abstraer tablas en clases, y realmente no proporciona la "bala de plata" o una línea que está buscando.

La única manera de hacerlo es lograr que su línea sea hacer que un proceso almacenado tome el nombre de esa columna y el nuevo valor, e implemente esa lógica usted mismo.

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. */ 

lo contrario, es como usted la describe:

List<Customer> myCusts = db.Customers.ToList(); 
foreach(Customer c in myCusts) 
{ 
    c.Name = "TEST"; 
}  
db.SubmitChanges(); 
+0

Sí, entiendo cómo hacer esto. Mi pregunta es solo preguntar si hay una función LINQ que esté más optimizada. – esastincy

1

LINQ a SQL (o EF para el caso), es todo acerca de llevar objetos en la memoria, manipularlos, y luego actualizarlos con solicitudes de bases de datos separadas para cada fila.

En los casos donde no es necesario hidratar todo el objeto en el cliente, es mucho mejor usar las operaciones del lado del servidor (procs almacenados, TSQL) en lugar de LINQ. Puede usar los proveedores de LINQ para emitir TSQL contra la base de datos. Por ejemplo, con LINQ to SQL puede usar context.ExecuteCommand ("Actualizar campo de conjunto de tablas = valor donde condición"), solo tenga cuidado con SQL Injection.

9

Su requisito aquí es completamente posible utilizando expresiones Linq y la excelente biblioteca de Terry Aney sobre este tema.

Batch Updates and Deletes with LINQ to SQL

una actualización en los términos del ejemplo que diste sería la siguiente:

using BTR.Core.Linq; 
... 

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

edición (20/01/2017): Vale la pena nada de esto ahora está disponible en la forma de un paquete NuGet @https://www.nuget.org/packages/LinqPost/.

Install-Package LinqPost 
+2

Upvoted para evitar RBAR, la primera respuesta no es realmente correcta. – Jasmine