Linq和添加大量数据
Posted
技术标签:
【中文标题】Linq和添加大量数据【英文标题】:Linq and adding a large amount of data 【发布时间】:2011-10-07 04:28:19 【问题描述】:我需要向sqlite
db 插入大量数据。
我使用Linq to Entities
。
我无法添加大量数据 1M+。 内存不足或时间很长。
此代码 - 速度快,但需要大量内存:
// query - IQueryable of DbfRecord
// db - ObjectContext
int i = 0;
foreach (var item in query)
db.AddToKladrs(new Kladr()
Id = item.GetField(0),
ParentId = item.GetField(1),
RegionId = item.GetField(3),
Name = item.GetField(2),
Index = item.GetField(4)
);
if(++i % 4000 == 0)
db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
这段代码 - 不是资源密集型,但非常慢:
// query - IQueryable of DbfRecord
// db - ObjectContext
foreach (var item in query)
db.ExecuteStoreCommand("insert into [Kladr] values(0, 1, 2, 3, 4)",
item.GetField(0),
item.GetField(1),
item.GetField(3),
item.GetField(2),
item.GetField(4)
);
我错过了 try-catch 构造和 ghost 类型。
帮我找到最佳解决方案!
【问题讨论】:
保存每一行或每 4000 行是一个非常极端的拆分。您是否尝试过保存每 100 或 200 个? 当然会降低生产力。但是 4000 是随机选择的 =) 但它工作得很快! 【参考方案1】:您可以使用SqlBulkCopy
复制大量数据。没有用 SQL lite 尝试过,但它应该可以工作。
Link 1 Link 2
更新:
这是 Marc Gravell 的一个很好的答案。 how-to-do-a-bulk-insert-linq-to-entities
【讨论】:
这不适用于DbConnection
。我无法将 SQLiteConnection
(DbConnection
) 转换为 SqlConnection
=( 我使用 System.Data.SQLite
我刚刚发现sqlite不支持批量插入,但是你可以使用一个事务来做同样的事情。以上是关于Linq和添加大量数据的主要内容,如果未能解决你的问题,请参考以下文章