簡體   English   中英

如何使用LINQ-to-SQL更新表而不必刪除所有現有記錄?

[英]How do I update a table with LINQ-to-SQL without having to delete all the existing records?

假設我有一個只包含兩列的簡單表:

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

我有一個名為UpdateMailList(IEnumerable <int > userIDs)的方法UpdateMailList(IEnumerable <int > userIDs)

在LINQ中,如何為傳入的參數中存在但在db中不存在的userID進行插入,刪除db中但不再存在於UserID中的那些,並保留已經存在的那些僅在db和userID中?

向用戶顯示一個復選框列表,當它第一次加載時,它會為已選中的maillist選擇現有成員。

然后,用戶可以檢查並取消選中各種用戶並點擊“保存”。 一旦發生這種情況,我需要使用清單的狀態更新數據庫的狀態。

這是我現在正在做的事情:

        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表中的所有條目並重新插入所有userIDs值更好的方法?

這樣的事情應該有效:

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

要查詢需要刪除的用戶,請執行:

var delUsers = from db in db.MailListUsers where!userKeys.Contains(u.UserKey)select u;

db.MailListUsers.DeleteAllOnSubmit(delUsers);

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

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

我不是百分百肯定會起作用; 或者,您可以選擇所有現有用戶密鑰,然后對此進行交叉引用:

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

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

HTH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM