обновление списка в БД с помощью linq-to-sql

#c# #asp.net #linq

#c# #asp.net #linq ( ссылка ) #linq

Вопрос:

Предполагается, что у меня есть мой контекст данных MyDC и список объектов с именем MyObject, определенных следующим образом:

 public class MyObject
{
  public int ObjectID {get;set;}
  public byte ObjectState {get;set;}
  public string ObjectInJson {get;set;}
}
  

Я пишу запрос для таблицы с именем ObjectsInJsonCache; имена столбцов для этой таблицы совпадают со свойствами объекта. Когда я получаю список MyObjects в функцию, я хочу либо вставить элемент, если его нет в базе данных, либо обновить элемент, если он уже есть.

Функция для запроса выглядит следующим образом:

 public static in CreateJsonCache(List<MyObject> TheListOfobjects)
{
    int NumberOfObjectsLoaded = 0;

    using ( MyDCdefinition MyDC = new MyDCdefinition())
    {
        ObjectsInJsonCache TheTable = new ObjectsInJsonCache();

        //do I use a foreach loop?
        //how do I switch insert/update?

        // this?: MyDC.ObjectsInJsonCache.InsertOnSubmit...
    }
    return NumberOfObjectsLoaded;
}
  

Как мне написать запрос в linq-to-sql? В частности, если список содержит 1000 элементов, я не хочу не разговаривать с БД 1000 раз, поэтому мне интересно, можно ли использовать цикл foreach. И какой запрос мне нужен? InsertOnSubmit?

Спасибо за ваши предложения.

Ответ №1:

Как правило, вам понадобятся 2 списка. 1 список, который уже есть в базе данных, и один список для обновления.

Сначала вы получаете все объекты, которых нет в базе данных. Что с этим делать, просто InsertAllOnSubmit .

Вам потребуется 2 обращения к базе данных. Сначала вы получаете все объекты, а затем отправляете изменения.

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

Чтобы получить все элементы, которых нет в БД, вы должны взять свой список ввода и использовать Except. Вам может понадобиться пользовательский компаратор, если вы не используете объект, созданный Linq. Кроме того, если вы не установили идентификатор элементов, которых нет в БД, вы можете просто проверить, ObjectID == default(int); если это так, то это новый. Но это зависит от вашей обработки идентификаторов.

Чтобы получить элементы, которые уже есть в БД, вы должны проверить Intersect. Затем вы выполняете цикл через них, а затем просто обновляете их.

Никакие обновления не будут отправляться в базу данных, пока вы не используете SubmitChanges .

Комментарии:

1. хорошо, что произойдет, если я просто выполню вставку, а элемент уже есть; будет ли он пропущен или обновлен?

2. @frenchie Если идентификатор, который он установил для элемента, который вы вставляете, и элемент уже находится в БД, будет выдано исключение

3. хорошо, у меня все получилось, как вы сказали: проверьте, есть ли в БД, и выполните вставку и удаление соответственно. Спасибо.

4. Отлично, следите, чтобы у вас не было непреднамеренных попаданий в БД, хотя 🙂

5. @Frenchie если вы не кэшируете вызов с помощью оператора ToList, в БД будет 2 вызова