2009-08-12 22 views
13

es necesario que actualice los valores pero estoy bucle todos los valores de las tablas de hacerlo:¿Cómo actualizar con Linq-To-SQL?

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    foreach (var sample in db.Samples) 
    { 
     var matches = samples.Where(a => a.Id == sample.Id); 
     if(matches.Any()) 
     { 
      var match = matches.First(); 
      match.SomeColumn = sample.SomeColumn; 
     } 
    } 
    db.SubmitChanges(); 
} 

Estoy seguro de que el código anterior no es la forma correcta de hacerlo, pero no podía pensar en cualquier de otra manera todavía. ¿Puedes mostrar una mejor manera?

+0

¿Está intentando actualizar entidades conectadas de entidades desconectadas? – Marc

+0

sí, estoy intentando actualizar entidades conectadas de entidades desconectadas –

Respuesta

24

Sí, hay una manera más simple. Mucho más simple Si asocia sus entidades al contexto y luego actualiza (con KeepCurrentValues ​​seleccionado), Linq to SQL obtendrá esas entidades del servidor, las comparará y marcará aquellas que sean diferentes. Tu código se vería algo como esto.

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    db.Samples.AttachAll(samples); 
    db.Refresh(RefreshMode.KeepCurrentValues, samples) 
    db.SubmitChanges(); 
} 

En este caso, LINQ to SQL es el uso de las claves para que coincida y actualizar registros así que mientras las llaves están en sincronía, estás bien.

+1

Corrección semántica pequeña, no "las marcadas actualizadas". Lo que hace es reemplazar el "valor original" de cada propiedad con los valores leídos de la base de datos. Como el "valor actual" de cada propiedad no se modifica, SubmitChanges sabrá actualizar los registros que tienen un valor original (que se leyó desde el servidor) que difiere del valor actual (que se pasó al método). –

+3

FYI, esto solo funcionará cuando samples sea un subconjunto de lo que existe en la base de datos. Existen dos suposiciones. 1. Nadie borrará ningún registro de esta tabla que exista en su enumeración de muestras. 2. En consecuencia, su colección de muestras no puede contener ninguna entrada nueva que haya agregado. – Marc

7

Con Linq2Sql (o Linq en entidades), no hay forma * de actualizar registros en el servidor sin recuperarlos en su totalidad primero, entonces lo que está haciendo es realmente correcto.

Si desea evitar esto, escriba un procedimiento almacenado que haga lo que desee y agréguelo a su modelo.

No estoy del todo seguro de si eso era su pregunta pretendido sin embargo :)

*: Hay algunos trucos de todo que el uso de LINQ para crear una sentencia SELECT y descuartizar la instrucción SELECT resultante en un UPDATE de alguna manera, pero No lo recomendaría.

Cuestiones relacionadas