Linq并添加大量数据

发布于 2024-11-24 06:32:08 字数 1045 浏览 1 评论 0原文

我需要将大量数据插入到 sqlite 数据库中。
我使用 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 构造和幽灵类型。

帮助我找到最佳解决方案!

I need insert to large amount of data to sqlite db.
I uses Linq to Entities.

I have problem to adding large amount of data 1M+.
Not enough memory or a very long time.

This code - fast, but requires a lot of memory:

// 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);
}

This code - not resource-intensive, but very slow:

// 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)
    );
}

I missed the try-catch construction and ghost types.

Help me find the best solution!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巾帼英雄 2024-12-01 06:32:17

您可以使用SqlBulkCopy复制大量数据。还没有尝试过使用 SQL lite,但它应该可以工作。

链接 1
链接 2

更新:

这是 Marc Gravell 的一个很好的答案。 如何-do-a-bulk-insert-linq-至实体

You can use the SqlBulkCopy for copying large amounts of data. Havn't tried it with SQL lite but it should work.

Link 1
Link 2

Update :

Here is a good answer by Marc Gravell. how-to-do-a-bulk-insert-linq-to-entities

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文