2010-01-14 9 views
5

Diciamo che ho una semplice tabella che contiene solo due colonne:Come si aggiorna una tabella con LINQ-to-SQL senza dover cancellare tutti i record esistenti?

MailingListUser
- PK ID (int)
- FK UserID (int)

ho un metodo chiamato UpdateMailList(IEnumerable<int> userIDs).

Come faccio, in LINQ, creare inserimenti per gli ID utente presenti nel parametro passato ma che non esistono nel db, eliminare quelli che sono nel db ma non più in UserID e lasciare il quelli che sono già presenti sia nel db che negli userID?

Un utente viene presentato con un elenco di caselle di controllo e, al primo caricamento, ha selezionato i membri esistenti selezionati per il maillista.

L'utente può quindi selezionare e deselezionare vari utenti e premere "salva". Una volta che questo accade, ho bisogno di aggiornare lo stato del database con lo stato della lista di controllo.

Ecco quello che sto facendo ora:

 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(); 
      } 
     } 
    } 
} 

C'è un modo migliore di una semplice cancellazione di tutte le voci della tabella di MailingListUser, e re-inserendo tutti i valori userids?

risposta

4

Qualcosa del genere dovrebbe funzionare:

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

Per interrogare gli utenti che hanno bisogno di eliminati, fare:

var = delUsers da u in db.MailListUsers dove userKeys.Contains (u.UserKey) selezionare u;!

db.MailListUsers.DeleteAllOnSubmit (delUsers);

Non sono sicuro che sia il modo migliore per eseguire i nuovi record. Si potrebbe fare questo, ma non sono sicuro che sia il più efficiente:

var = newUserKeys da u in userKeys dove (db.MailListUsers.Where (j => j.UserKey == u.UserKey) Count() == 0) seleziona u;

Non sono sicuro al 100% che funzioni; in alternativa, è possibile selezionare tutte le chiavi utente esistenti e quindi eseguire il confronto con questo:

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

Ancora una volta, non si conoscono tutte le implicazioni in termini di prestazioni.

HTH.

Problemi correlati