#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 вызова