Я получаю доступ к DB через BLToolkit. Одна из моих таблиц:
Я создал список объектов:
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, не создаются программно, они извлекаются из базы данных в последнее время на основе запросов других таблиц. Может быть, вместе с получением этих данных я должен попробовать и получить идентификаторы для существующих объектов и использовать эту информацию для принятия решения о вставке или обновлении?
Если ваши объекты поступают из другой таблицы, вы можете сделать левое соединение для сортировки, для каких объектов необходимо Вставить или Обновить:
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);