Как правильно InsertAllOnSubmit() и это лучше, чем цикл InsertOnSubmit()?
скажем, у меня есть:
using (SomeDataContext db = new SomeDataContext())
{
foreach(Item i in Items)
{
DbItem d = new DbItem;
d.value = i.value;
//.... etc ...
db.InsertOnSubmit(d);
}
db.SubmitChanges();
}
возможно ли и / или лучше (хуже?) делать:
using (SomeDataContext db = new SomeDataContext())
{
IEnumerable<DbItem> dbItems = //???? possible?
foreach(Item i in Items)
{
DbItem d = new DbItem;
d.value = i.value;
//.... etc ...
dbItems.Add(d); // ???? again, somehow possible?
}
db.InsertAllOnSubmit(dbItems);
db.SubmitChanges();
}
3 ответов
Ну вы могли бы использовать List<T>
:
using (SomeDataContext db = new SomeDataContext())
{
List<DbItem> dbItems = new List<DbItem>();
foreach(Item i in Items)
{
DbItem d = new DbItem;
d.value = i.value;
//.... etc ...
dbItems.Add(d);
}
db.InsertAllOnSubmit(dbItems);
db.SubmitChanges();
}
будет ли это более эффективным или нет, я не знаю.
вы не увидите никакого улучшения производительности здесь, потому что ничего не происходит, пока вы не позвоните SubmitChanges()
.
но даже если бы вы делали что-то уродливое, как это
foreach(Item i in Items)
{
DbItem d = new DbItem;
d.value = i.value;
//.... etc ...
db.InsertOnSubmit(d);
db.SubmitChanges();
}
Я бы не ожидал значительного снижения производительности. Это связано с тем, что LINQ-to-SQL выполняет сингулярные вставки.
даже если вы используете InsertAllOnSubmit
, вы все равно увидите отдельную команду SQL для каждого строка вставляется.
Не говоря, что это лучше или хуже, но в любое время вы можете сделать один вызов базы данных против вызова базы данных в цикле вы увидите повышение производительности. Что теперь?!--0--> делает за кулисами что-то вне нашего контроля.