Позволяет говорят, что у меня есть простая таблица, которая только содержит два столбца:
MailingListUser
- Идентификатор PK (интервал)
- FK UserID (интервал)
Мне назвали метод UpdateMailList(IEnumerable
. <int
> userIDs)
То, как делают я, в LINQ, делаю, вставляет для идентификаторов пользователей, которые присутствуют в переданном в параметре, но не существуют в дб, удаляют те, которые находятся в дб, но больше в UserIDs и оставляют тех, которые уже находятся и в дб и в одних только идентификаторах пользователей?
Пользователю дарят список флажка, и когда он сначала загружается, ему выбрали существующих участников для проверенного 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 и перевставки всех значений идентификаторов пользователей?
Что-то вроде этого должно работать:
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 = от U в db.maillistusers где! userkeys.contains (u.userkey) Выберите U;
db.maillistusers.deleteallLonsubmit (delusers);
Я не уверен, что лучший способ сделать новые записи. Вы могли бы сделать это, но я не уверен, что это самое эффективное:
var neuserkeys = от U в kellkeys где (db.maillistusers.gh где (j => j.userkey == u.userkey) .count () == 0) Выберите U;
Я не на 100% уверен, что будет работать; В качестве альтернативы вы можете выбрать все существующие пользовательские клавиши, а затем пересекайте ссылку против этого:
var neuserkeys = userkeys.gh (i =>! ustralkeys.contains (i.userkey));
снова T знать все последствия производительности.
HTH.