gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:32 24 4
gpt4 key购买 nike

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

那么问题来了:是否可以使用 Linq to 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 to EF 不知道如何处理它)。那么最终,这是一条可行的路径吗?如果不是,是否有任何可行的替代方案?

最佳答案

使用 EF 不会比 SqlBulkCopy 更快。 EntityFramework 是一个 ORM,因此即使您关闭所有可能的选项,它仍然会比 SqlBulkCopy 慢,因为它想要获取原始 sql 数据并具体化对象。

SqlBulkCopy 就像打开数据库的消防水管。它将关闭约束并使用定期写入数据库的不同机制。

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

这是对 SqlBulkCopy 的一个古老但很好的解释

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

关于c# - 使用 Entity Framework 在数据库上执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com