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和添加大量数据的主要内容,如果未能解决你的问题,请参考以下文章

大量数据的linq查询延迟结果

使用LINQ2SQL插入大量记录

创建大量对象时内存不足C#

Linq基础+Lambda表达式对数据库的增删改及简单查询

2017-06-01Linq基础+Lambda表达式实现对数据库的增删改查

LINQ入门