Как обновить таблицу с помощью LINQ-to-SQL, не удаляя все существующие записи? - PullRequest
5 голосов
/ 14 января 2010

Допустим, у меня есть простая таблица, которая содержит только два столбца:

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

У меня есть метод с именем UpdateMailList(IEnumerable<code><int> userIDs) .

Как в LINQ сделать вставки для идентификаторов пользователей, которые присутствуют в переданном параметре in, но не существуют в базе данных, удалить те, которые находятся в базе данных, но больше не в идентификаторах пользователей, и оставить те, которые уже есть только в базе данных и идентификаторах пользователей?

Пользователю предоставляется список флажков, и при первой загрузке он проверяет существующие элементы, выбранные для списка рассылки.

Пользователь может затем проверять и снимать флажки с разных пользователей и нажимать «Сохранить». Как только это произойдет, мне нужно обновить состояние базы данных с помощью состояния контрольного списка.

Вот что я сейчас делаю:

        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?

Ответы [ 2 ]

4 голосов
/ 15 января 2010

Примерно так должно работать:

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 голосов
/ 15 января 2010

Чтобы запросить пользователей, которых нужно удалить, выполните:

var delUsers = от вас в db.MailListUsers где! userKeys.Contains (u.UserKey) выберите u;

db.MailListUsers.DeleteAllOnSubmit (delUsers);

Я не уверен, что лучший способ сделать новые записи. Вы могли бы сделать это, но я не уверен, что это наиболее эффективно:

var newUserKeys = от вас в userKeys где (db.MailListUsers.Where (j => j.UserKey == u.UserKey) .Count () == 0) выберите u;

Я не уверен на 100%, что это сработает; В качестве альтернативы, вы можете выбрать все существующие ключи пользователя, а затем сделать перекрестную ссылку на это:

var newUserKeys = userKeys.Where (i =>! СуществующиеKeys.Contains (i.UserKey));

Опять же, не знаю всех последствий для производительности.

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...