如何使用LINQ-to-SQL更新表而不必删除所有现有记录?

时间:2010-01-14 18:15:47

标签: c# .net linq linq-to-sql

假设我有一个只包含两列的简单表:

  

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

我有一个名为UpdateMailList(IEnumerable<int> userIDs)的方法。

如何在LINQ中为传入的参数中存在但在db中不存在的用户ID进行插入,删除数据库中但不再存在于UserID中的用户ID,并保留已经在db和userID中的?

向用户显示一个复选框列表,当它首次加载时,会选中为已选中的maillist选择的现有成员。

然后,用户可以选中并取消选中各种用户并点击“保存”。一旦发生这种情况,我需要用清单的状态更新数据库的状态。

以下是我现在正在做的事情:

<int

有没有比简单地删除MailingListUser表中的所有条目并重新插入所有userIDs值更好的方法?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

要查询需要删除的用户,请执行以下操作:

var delUsers =来自db.MailListUsers中的u                where!userKeys.Contains(u.UserKey)                选择你;

db.MailListUsers.DeleteAllOnSubmit(delUsers);

我不确定做新记录的最佳方法。你可以做到这一点,但我不确定这是最有效的:

var newUserKeys =来自userKeys中的u                   where(db.MailListUsers.Where(j =&gt; j.UserKey == u.UserKey).Count()== 0)                   选择你;

我不是百分百肯定会起作用;或者,您可以选择所有现有用户密钥,然后对此进行交叉引用:

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

同样,不知道所有性能影响。

HTH。