gpt4 book ai didi

c# - Entity Framework 的大批量更新比我自己批处理慢得多

转载 作者:行者123 更新时间:2023-11-30 20:27:15 29 4
gpt4 key购买 nike

使用我认为的标准 Entity Framework 技术更新一堆记录比批处理它自己生成的相同查询要慢得多。对于 250 条记录,我发现 Entity Framework 的速度要慢大约 10 倍。对于 1000 条记录,它会慢大约 20 倍。

当我记录 Entity Framework 的数据库事件时,我看到它正在生成与我自己生成的相同的基本查询,但它似乎一次运行一个而不是一次运行所有查询,即使我只调用 SaveChanges一次。有什么办法让它一次运行所有查询吗?

我无法执行简单的大量 SQL 更新,因为在我的实际用例中,需要单独处理每一行以确定将字段设置为什么。

示例时间代码如下:

var stopwatchEntity = new System.Diagnostics.Stopwatch();
var stopwatchUpdate = new System.Diagnostics.Stopwatch();
using (var dbo = new ProjDb.dbo("Server=server;Database=database;Trusted_Connection=True;"))
{
var resourceIds = dbo.Resources.Select(r => r.ResourceId).Take(250).ToList();

//dbo.Database.Log += (s) => System.Diagnostics.Debug.WriteLine(s);

stopwatchEntity.Start();
foreach (var resourceId in resourceIds)
{
var resource = new ProjDb.Models.dbo.Resource { ResourceId = resourceId };
dbo.Resources.Attach(resource);
resource.IsBlank = false;
}
dbo.SaveChanges();
stopwatchEntity.Stop();

stopwatchUpdate.Start();
var updateStr = "";
foreach (var resourceId in resourceIds)
updateStr += "UPDATE Resources SET IsBlank = 0 WHERE ResourceId = " + resourceId + ";";
dbo.Database.ExecuteSqlCommand(updateStr);
stopwatchUpdate.Stop();

MessageBox.Show(stopwatchEntity.Elapsed.TotalSeconds.ToString("f") + ", " + stopwatchUpdate.Elapsed.TotalSeconds.ToString("f"));
}

最佳答案

正如@EricEJ 和@Kirchner 报道的那样,EF6 不支持批量更新。但是,一些第三方库会这样做。


免责声明:我是项目的所有者Entity Framework Plus

EF+ 批量更新允许使用相同的值/公式更新多行。

例如:

context.Resources
.Where(x => resourceIds.Contains(x => x.ResourceId)
.Update(x => new Resource() { IsBlank = false });

由于实体未在上下文中加载,因此您应该获得最佳性能。

阅读更多:http://entityframework-plus.net/batch-update


免责声明:我是项目的所有者Entity Framework Extensions

如果一行与另一行的值必须不同,此库允许使用 BulkUpdate 功能。这个库是一个付费库,但几乎支持性能所需的一切:

  • 批量保存更改
  • 批量插入
  • 批量删除
  • 批量更新
  • 批量合并

例如:

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);
context.BulkMerge(customers);

关于c# - Entity Framework 的大批量更新比我自己批处理慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871463/

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