Как заполнить таблицу путем вставки или обновления

1

Я получаю доступ к DB через BLToolkit. Одна из моих таблиц:

  • поля: Id, TeamId, PlayerId, Val1, Val2
  • первичный ключ - идентификатор поля, автоинкрементный
  • составной уникальный ключ, состоящий из 2 полей TeamId и PlayerId
  • поля данных Val1, Val2

Я создал список объектов:

List<MyObj> objs = new []{
    new MyObj{TeamId=2, PlayerId=3, Val1=1234, Val2=111},
    new MyObj{TeamId=2, PlayerId=4, Val1=2345, Val2=444},
    new MyObj{TeamId=2, PlayerId=5, Val1=3456, Val2=666},
    };

Я мог бы вставить все эти объекты в БД, используя

db.InsertBatch(objs);

Но некоторые записи с одним и тем же составным ключом могут быть уже в БД, поэтому вместо INSERT я хотел бы иметь обновление для этих объектов, выполняемых автоматически.

Я знаю, что BLToolkit имеет InsertOrUpdate и InsertOrReplace, но оба они работают только с одним объектом.

Есть ли способ, которым я могу вставить InsertOrUpdate/Заменить список объектов в 1 запросе в БД?

Спасибо.

PS На самом деле данные, которые я перечислял в objs, не создаются программно, они извлекаются из базы данных в последнее время на основе запросов других таблиц. Может быть, вместе с получением этих данных я должен попробовать и получить идентификаторы для существующих объектов и использовать эту информацию для принятия решения о вставке или обновлении?

Теги:
linq
bltoolkit

1 ответ

0

Если ваши объекты поступают из другой таблицы, вы можете сделать левое соединение для сортировки, для каких объектов необходимо Вставить или Обновить:

var useInsertQuery = from o in db.OtherObjs
            join m in db.MyObjs on new { m.TeamId, m.PlayerId } equals new { o.TeamId, o.PlayerId } into moJoin
            from mo in moJoin.DefaultIfEmpty()
            let useInsert = (mo == null)
            // MyObj f(OtherObj otherObj) creates your updated MyObj value
            group f(m,o) by useInsert into g;
var useInsertDictionary = useInsertQuery.ToDictionary(g => g.Key, g => g.ToArray());

MyObj[] objs;
if (useInsertDictionary.TryGetValue(true, out objs))
    db.InsertBatch(objs);
if (useInsertDictionary.TryGetValue(false, out objs))
    db.Update(objs);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню