2008-12-08 23 views
17

Hace algún tiempo, escribí un fragmento de código para actualizar varias filas en una tabla de base de datos. El código fue asíActualizando varias filas Linq vs SQL

var db = new MyDataContext(); 
db.Execute("UPDATE Details SET IsActive = 0 WHERE MasterId = 1"); 

A continuación, el otro día cuando llegué a la última versión del archivo que he visto que alguien cambió el código para algo como esto

var details = from d in db.details where d.MasterId == 1 select d; 
foreach (var detail in details) 
    detail.IsActive = false; 
db.SubmitChanges(); 

Así que mi pregunta es: ¿Cuál es la mejor manera de actualizar varias filas? ¿Usando Linq o SQL?

Respuesta

9

Yo diría que depende de si la eficiencia o la abstracción de la base de datos es más importante para usted. El modo SQL va a crear una dependencia en su código que es más difícil de rastrear, pero es más eficiente. El ejemplo de LINQ citado elimina la dependencia del código manual codificado pero implica al menos 2 consultas y algún procesamiento del lado del servidor.

+0

No añadiré una respuesta adicional - mi idea es que si querías una respuesta, entonces tendría que ser SQL para una operación * set *, es decir, donde quieres afectar muchas filas con una sola declaración, pero como usted dice que en realidad es una solución de compromiso, qué compromiso quiere hacer. – Murph

14

Comprobar el enfoque utilizado en este artículo:

+0

El enlace está roto –

+0

Aquí está el enlace de trabajo: https://terryaney.wordpress.com/2008/04/14/batch-updates-and-deletes-with-linq-to-sql/ –

4

PLINQO ha implementado las actualizaciones y eliminaciones por lotes y cada entidad generada por plinqo puede utilizar la actualización por lotes y eliminar operaciones.

context.Task.Update(t => t.Id == 1, t2 => new Task {StatusId = 2}); 

Esto realizará una Update Task Set StatusId = 2 Where Id = 1

1
for (int i = 0; i < pListOrderDetail.Count; i++) 
{ 
    for (int j = 0; j < stempdata.Count; j++) 
    { 
     pListOrderDetail[i].OrderID = pOrderID; 
     pListOrderDetail[i].ProductID = stempdata[j].pProductID; 
     pListOrderDetail[i].Quantity = stempdata[j].pQuantity; 
     pListOrderDetail[i].UnitPrice = stempdata[j].pUnitPrice; 
     pListOrderDetail[i].Discount = stempdata[j].pDiscount; 
     db.SubmitChanges(); 
     break; 
    } 
    continue; 
} 
0

La versión de LINQ a SQL va a SELECT cada fila de la tabla details que coincide con la consulta, tirar de ellos en la memoria, y crear objetos para ellos. Luego, cuando aplique las actualizaciones, usará una declaración separada UPDATE para cada objeto, y incluirá (por defecto) una cláusula WHERE que verifica el valor de cada columna para asegurarse de que no ha cambiado desde que hizo el SELECT. Si la fila ha cambiado, Linq lanzará una excepción.

La versión Linq del código va a ser MUCHO más lenta (piense 100x o 1000x más despacio), y lo expondrá a excepciones adicionales.

La versión de SQL puede ser un poco más difícil de mantener a medida que refactoriza el código en el futuro, pero hará una gran diferencia en su base de datos.

Por lo general, creo que Linq-to-SQL es ideal para selectas y actualizaciones individuales, y quizás para lotes pequeños la base de datos sea lo suficientemente rápida para que las consultas adicionales no supongan un problema, pero tendría que pensar cuidadosamente antes Usé Linq para lotes grandes, o en un servidor web.