2010-01-14 21 views
5

Digamos que tengo una tabla simple que sólo contiene dos columnas:¿Cómo actualizo una tabla con LINQ-to-SQL sin tener que eliminar todos los registros existentes?

MailingListUser
- PK ID (int)
- FK ID de usuario (int)

tengo un método llamado UpdateMailList(IEnumerable<int> userIDs).

¿Cómo hago, en LINQ, hacer inserciones para los ID de usuario que están presentes en el parámetro pasado pero no existen en la base de datos, eliminar los que están en la base de datos pero ya no en los ID de usuario, y dejar el unos que ya están en los db y los ID de usuario solos?

A un usuario se le presenta una lista de casillas de verificación y, cuando se carga por primera vez, se seleccionan los miembros existentes seleccionados para la lista maillista.

El usuario puede marcar y desmarcar varios usuarios y presionar "guardar". Una vez que esto sucede, necesito actualizar el estado de la base de datos con el estado de la lista de verificación.

Aquí es lo que estoy haciendo ahora:

 public void UpdateMailList(IEnumerable<int> userIDs) 
     { 
      using (MainDataContext db = new MainDataContext()) 
      { 
       var existingUsers = (from a in db.MailListUsers 
            select a); 

       db.MailListUsers.DeleteAllOnSubmit(existingUsers); 
       db.SubmitChanges(); 


       var newUsers = (from n in userIDs 
           select new MailListUser 
           { 
            UserID = n 
           }); 

       db.MailListUsers.InsertAllOnSubmit(newUsers); 
       db.SubmitChanges(); 
      } 
     } 
    } 
} 

¿Hay una manera mejor que simplemente borrando todas las entradas en la tabla MailingListUser, y volver a insertar todos los valores de ID de usuario?

Respuesta

4

Algo como esto debería funcionar:

var existingUsers = from u in db.MailListUsers 
        select u; 

var deletedUsers = from u in existingUsers 
        where !userIDs.Contains(u.UserID) 
        select u; 

var newUsers = from n in userIDs 
       let ids = from u in existingUsers 
         select u.UserID 
       where !ids.Contains(n) 
       select new MailListUser { 
        UserID = n 
       }; 

db.MailListUsers.DeleteAllOnSubmit(deletedUsers); 
db.MailListUsers.InsertAllOnSubmit(newUsers); 
db.SubmitChanges(); 
0

Para consultar los usuarios que necesitan ser eliminados, hacer:

delUsers var = de u en db.MailListUsers donde userKeys.Contains (u.UserKey) seleccionar u;!

db.MailListUsers.DeleteAllOnSubmit (delUsers);

No estoy seguro de la mejor manera de hacer los nuevos registros. Usted puede hacer esto, pero no estoy seguro de que es el más eficiente:

newUserKeys var = de u en donde UserKeys (db.MailListUsers.Where (j => j.UserKey == u.UserKey) .count() == 0) seleccione u;

No estoy 100% seguro de que eso funcione; como alternativa, puede seleccionar todas las claves de usuario existentes y luego hacer una referencia cruzada en contra de esto:

var newUserKeys = userKeys.Where (i =>! existingKeys.Contains (i.UserKey));

De nuevo, no sé todas las implicaciones de rendimiento.

HTH.

Cuestiones relacionadas