Как добавить в список с Linq to SQL?
У меня есть таблица в базе данных, которую я извлекаю с помощью LINQ to SQL, и как часть своей обработки я хочу добавить в этот список, а затем обновить базу данных новыми элементами + любые изменения, которые я внес.
Я думал, что смогу сделать следующее:
var list = (from item in db.Table
select item).ToList();
[do processing where I modify items & add to the list]
list = list.Distinct();
db.SubmitChanges();
Что происходит, так это то, что изменения произошли (т.е. обновления SQL), но любые новые элементы, которые я добавляю в список, не добавляются.
Очевидно, я делаю это неправильно, как правильно изменить и добавить в список объектов БД, а затем зафиксировать все обновления и вставки?
4 ответа
Список не имеет смысла. Просто случается, что он содержит объекты, о которых знает DataContext. Нам нужно убедиться, что DataContext знает о новых. Важно то, что они не должны быть полными, когда мы сообщаем им DataContext:
Item item;
if (needNewOne)
{
item = new Item();
db.InsertOnSubmit(item);
}
else
{
item = list[i];
}
/// build new or modify existing item
/// :
db.SubmitChanges();
Вы можете создать метод расширения для него:
static void EnsureInsertedOnSubmit<TEntity>( this Table<TEntity> table
,IEnumerable<TEntity> entities)
{ foreach(var entity in entities)
{ if ( table.GetModifiedMembers(entity).Length == 0
&& table.GetOriginalEntityState(entity) == default(TEntity))
{ table.InsertOnSubmit(entity);
}
}
}
И тогда вы можете сделать это:
var list = db.Table1.ToList();
list.Add(new Item());
db.Table1.EnsureInsertedOnSubmit(list);
db.SubmitChanges();
Вы должны указать LINQ вставить новую строку при отправке, используя InsertOnSubmit:
db.InsertOnSubmit(newrow);
db.SubmitChanges();
Вам не нужен новый DataContext, вы можете использовать тот, который вы используете для обновлений.
То же самое для удаления DeleteOnSubmit(строка). Изменения будут отслеживаться, хотя.