Как правильно 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--> делает за кулисами что-то вне нашего контроля.