使用Entity Framework在数据库上执行命令

时间:2017-01-26 14:41:28

标签: c# entity-framework linq entity-framework-6 linq-to-entities

我想根据数据库中的其他数据在我的数据库上执行一个可能非常大的插入。性能在这个应用程序上很重要,即使使用SqlBulkCopy,这个过程也会因为我的喜好而减慢。

所以问题是:可以使用Linq到EF自动生成并运行数据库上的SQL代码,永远不会将任何内容返回给用户吗?对我来说似乎是可能的,我只是不知道如何绕过它。

这是前提:以下的东西能不能起作用?

myContext.OutputTable.AddRange(
    myContext.TableA.Join(
        myContext.TableB,
        a => a.myAKey,
        b => b.myBKey,
        (a, b) => new { a.fieldA, a.fieldB, b.fieldC }).Select(
    output => new OutputTable
    {
        myOutputColumnA = output.FieldA,
        myOutputColumnB = output.FieldB,
        myOutputColumnC = output.FieldC
    })
);

也许我在这里想做的事情并不明显。我基本上试图使用来自TableA和TableB的数据将数据插入“OutputTable”,而不让EntityFramework将数据返回给应用程序。现在,我知道可以使用ExecuteNonQuery()来运行这种插入语句,但最终,我不希望这样做有几个不同的原因:我希望能够保持整个代码在C#;我还想保留Linq提供的调试方面(因为我使用Visual Studio,它有助于在代码失败的同一地方查询失败)。

我知道Linq to EF会生成在数据库上执行的SQL,因此我似乎可以完成此任务(可能必须故意忽略延迟加载,因此代码实际执行)。上面的代码没有执行,我相信前提是新的对象不能以这种方式在Select()语句中实例化(Linq到EF不知道如何处理它)。最终,这是一条可行的道路,如果没有,是否有可行的替代方案?

1 个答案:

答案 0 :(得分:1)

使用EF,你不会比SqlBulkCopy更快。 EntityFramework是一个ORM,所以即使你关闭每个可能的选项,它仍然会比SqlBulkCopy慢,因为它想要获取原始的sql数据并实现对象。

SqlBulkCopy就像打开一个firehose到数据库。它会关闭约束并使用一种不同的机制来定期写入数据库。

任何比这更快的东西都必须包含在数据库中,就像Gert提到的评论一样。

这里有一个旧的但很好的解释SqlBulkCopy

http://www.sqlbi.com/wp-content/uploads/SqlBulkCopy-Performance-1.0.pdf