c# - 加速 LINQ 插入

标签 c# linq linq-to-sql ado.net

我有一个 CSV 文件,我必须将它插入到 SQL Server 数据库中。有没有办法加快 LINQ 插入速度?

我创建了一个简单的 Repository 方法来保存记录:

    public void SaveOffer(Offer offer)
    {
        Offer dbOffer = this.db.Offers.SingleOrDefault (
             o => o.offer_id == offer.offer_id);

        // add new offer
        if (dbOffer == null)
        {
            this.db.Offers.InsertOnSubmit(offer);
        }
        //update existing offer
        else
        {
            dbOffer = offer;
        }

        this.db.SubmitChanges();
    }

但是使用这种方法,程序比使用 ADO.net SQL 插入(新的 SqlConnection、新的 SqlCommand 用于选择(如果存在)、新的 SqlCommand 用于更新/插入)插入数据要慢得多。

在 100k csv 行上大约需要一个小时,而对于 ADO.net 方式则需要 1 分钟左右。对于 2M csv 行,ADO.net 花费了大约 20 分钟。 LINQ 在 25 分钟内添加了 200 万行中的大约 30k。我的数据库有 3 个表,链接在 dbml 中,但其他两个表是空的。测试是在所有表都是空的情况下进行的。

附言我曾尝试使用 SqlBulkCopy,但我需要在将其插入数据库之前对 Offer 进行一些转换,我认为这违背了 SqlBulkCopy 的目的。

更新/编辑: 18 小时后,LINQ 版本仅添加了约 20 万行。

我也测试了仅使用 LINQ 插入的导入,而且与 ADO.net 相比确实很慢。我没有看到仅插入/提交更改和选择/更新/插入/提交更改之间有什么大的区别。

我仍然需要尝试批量提交,手动连接到数据库并编译查询。

最佳答案

SubmitChanges 不批量更改,它对每个对象执行单个插入语句。如果你想做快速插入,我认为你需要停止使用 LINQ。

在执行 SubmitChanges 时,启动 SQL Profiler 并观察正在执行的 SQL。

参见问题“LINQ to SQL 可以执行批量更新和删除吗?还是它总是一次只更新一行?”这里:http://www.hookedonlinq.com/LINQToSQLFAQ.ashx

它链接到这篇文章:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx它使用扩展方法来修复 linq 无法批量插入和更新等问题。

关于c# - 加速 LINQ 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1328683/

相关文章:

c# - 暂停和恢复线程的替代方法有哪些?

c# - 带连接的 linq 查询返回不正确的值/关联

c# - 在 Linq 的数据表数据行中选择大小写

c# - "Only arguments that can be evaluated on the client are supported for the String.Contains method"

c# - 哪个更好用,为什么在 C# 中

c# - 如何在派生类中或通过分部类实现接口(interface)?

c# - 如何将指定属性的 lambda 表达式转换为表示相同属性的 asp.net mvc 兼容 'name' 字符串?

winforms - Winforms 中使用 linq-to-sql 进行 CRUD

c# - 使用 Linq to SQL,如何查找表中列的最小值和最大值?

c# - 捕获所有 Windows 消息