用linq-to-sql插入对象列表
问题描述:
我有一个用linq-to-sql插入到数据库中的对象列表。 目前,我使用foreach循环,增加了每个元素,看起来大致是这样的:用linq-to-sql插入对象列表
foreach (o in List<MyObjectModel)
{
using MyDataContext
{
TheLinqToSqlTableModel TheTable = new TheLinqToSqlTableModel();
TheTable.Fieldname = o.Fieldname;
.... repeat for each field
MyDataContext.TheTablename.InsertOnSubmit(TheTable);
MyDataContext.SubmitChanges();
}
}
有没有更好的方式使用LINQ到SQL插入一个数据库对象的列表?
感谢您的建议。
答
需要考虑的一些快速改进..
a)为什么要为每次迭代创建datacontext?
Using(Datacontext dc = new Datacontext())
{
foreach(...)
{
}
dc.SubmitChanges();
}
b)为插入创建存储过程并使用它将对性能有好处。
c)如果遇到任何错误,使用事务范围来撤消插入。
Using (TransactionScope ts = new TransactionScope())
{
dc.SubmitChanges();
}
答
List<Object> Obj = (Enter the List you want to pass)
foreach (var item in Obj)
{
item.Get your desired value after the dot
}
答
你为什么不使用InsertAllOnSubmit()方法。
例子:
IEnumerable<Post> _post = getAllNewPost();
Using(Datacontext dc = new Datacontext())
{
dc.Posts.InsertAllOnSubmit(_post);
dc.SubmitChanges();
}
这就是你需要的。
////////////////////////
+1在这里重用上下文是个好主意。使用存储过程是更好的方法。 LINQ不会批量执行'INSERT' /'UPDATE',因为它实际上并不打算。 – Yuck 2012-02-01 14:09:13
明白了:linq-to-sql中没有批量操作;感谢您重复使用DC的提示。 – frenchie 2012-02-01 14:22:56
linq-to-sql将为SubmitChanges的每次调用添加一个事务,只要您只在事务范围无用时调用它即可。在foreach中使用插入sp也不会将其更改为bulkinsert。在这种情况下,你需要移动到SqlBulkCopy – Pleun 2012-02-01 14:32:20