2010-01-14 54 views
5

可以說我有一個簡單的表,只包含兩列:如何使用LINQ-to-SQL更新表格而不必刪除所有現有記錄?

MailingListUser
- PK ID(INT)
- FK 用戶名(INT)

我有一種稱爲UpdateMailList(IEnumerable<int> userIDs)的方法。

我如何在LINQ中爲傳入參數中存在但不存在於數據庫中的用戶標識插入,刪除數據庫中但不再存在於用戶標識中的那些,並保留那些已經在數據庫和用戶ID中的人?

用戶會看到一個複選框列表,當它第一次加載時,會爲已選中的成員選中檢查郵件列表。

用戶可以選中並取消選中不同的用戶並點擊「保存」。一旦發生這種情況,我需要用清單的狀態更新數據庫的狀態。

這是我現在在做什麼:

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

難道還有比簡單的刪除在MailingListUser表中的所有條目的更好的方法,並重新插入所有用戶ID值?

回答

4

像這樣的東西應該工作:

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

若要查詢需要刪除的用戶,這樣做:

VAR delUsers =從u在​​db.MailListUsers 其中userKeys.Contains(u.UserKey) 選擇U;!

db.MailListUsers.DeleteAllOnSubmit(delUsers);

我不確定做新記錄的最佳方法。你可以做到這一點,但我不確定這是最有效的:

var newUserKeys = from userKeys where(db.MailListUsers.Where(j => j.UserKey == u.UserKey).Count ()== 0) select u;

我不是100%肯定會工作;或者,您可以選擇所有現有的用戶密鑰,然後交叉引用:

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

同樣,不知道所有的性能影響。

HTH。

相關問題