2010-01-14 11 views
5

Lets sagen, dass ich eine einfache Tabelle, die nur zwei Spalten enthält:Wie aktualisiere ich eine Tabelle mit LINQ-to-SQL, ohne alle vorhandenen Datensätze löschen zu müssen?

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

Ich habe eine Methode namens UpdateMailList(IEnumerable<int> userIDs).

Wie mache ich in LINQ Einfügungen für die Benutzer-IDs, die im übergebenen Parameter vorhanden sind, aber nicht in der db vorhanden sind, lösche diejenigen, die in der db aber nicht mehr in UserIDs sind, und lasse die diejenigen, die bereits in der Datenbank und Benutzer-IDs allein sind?

Einem Benutzer wird eine Checkbox-Liste angezeigt, und beim ersten Laden werden die vorhandenen Mitglieder für den Maillist ausgewählt.

Der Benutzer kann dann verschiedene Benutzer aktivieren und deaktivieren und auf "Speichern" klicken. Sobald dies passiert, muss ich den Zustand der Datenbank mit dem Status der Checkliste aktualisieren.

Hier ist, was ich tue jetzt:

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

Gibt es einen besseren Weg, als einfach alle Einträge in der Tabelle MailingListUser Löschen und Wiedereinsetzen alle Benutzer-IDs Werte?

Antwort

4

So etwas sollte funktionieren:

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

Benutzer abzufragen, die gelöscht müssen, tun:

var delUsers = von u in db.MailListUsers wo userKeys.Contains (u.UserKey) u wählen;!

db.MailListUsers.DeleteAllOnSubmit (delUsers);

Ich bin mir nicht sicher, der beste Weg, um die neuen Aufzeichnungen zu tun. Sie können dies tun, aber ich bin mir nicht sicher, das ist der effizienteste:

var newUserKeys = von u in Userkeys wo (db.MailListUsers.Where (j => j.UserKey == u.UserKey) .Count() == 0) wähle u;

Ich bin nicht 100% sicher, dass das funktionieren würde; alternativ können Sie alle vorhandenen Benutzerschlüssel auswählen und dann einen Verweis darauf setzen:

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

Noch einmal, ich kenne nicht alle Auswirkungen auf die Leistung.

HTH.

Verwandte Themen