Entity Framework:批量批量更新FromQuery
Entity Framework: Bulk UpdateFromQuery in Batches
我想对超过一百万行执行批量更新。
但是,我不想更新整个 table,而是希望分批更新(以防止锁定整个 table)。每 10,000 行说一次。
例如,类似于这个答案:
目前正在使用 UpdateFromQuery 不加载整个上下文,直接更新数据库。
现在如何批量更新?我应该使用 .Take
函数吗?
var productUpdate = _dbContext.Set<Product>()
.Where(x => x.ProductType == 'Electronics')
.UpdateFromQuery( x => new Product { ProductBrand = "ABC Company" });
目标代码:
SET @BatchSize = 10000;
SET @Rows = @BatchSize; -- initialize just to enter the loop
BEGIN TRY
WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) prod
SET Value = 'ABC Company'
FROM dbo.Products prod
WHERE prod.ProductType = 'Electronics'
SET @Rows = @@ROWCOUNT;
END;
注意:除非需要,否则目前避免使用 RawSql
免责声明:我是项目的所有者Entity Framework Plus
目前无法使用 BatchSize
进行更新。
但是,我们会考虑并提供此功能。
功能发布后我会更新此答案。
编辑:答案更新
从 v3.0.61 开始,SQL 服务器现在支持 BatchSize
选项。
您现在可以在使用 UpdateFromQuery
时指定 BatchSize
我想对超过一百万行执行批量更新。
但是,我不想更新整个 table,而是希望分批更新(以防止锁定整个 table)。每 10,000 行说一次。
例如,类似于这个答案:
目前正在使用 UpdateFromQuery 不加载整个上下文,直接更新数据库。
现在如何批量更新?我应该使用 .Take
函数吗?
var productUpdate = _dbContext.Set<Product>()
.Where(x => x.ProductType == 'Electronics')
.UpdateFromQuery( x => new Product { ProductBrand = "ABC Company" });
目标代码:
SET @BatchSize = 10000;
SET @Rows = @BatchSize; -- initialize just to enter the loop
BEGIN TRY
WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) prod
SET Value = 'ABC Company'
FROM dbo.Products prod
WHERE prod.ProductType = 'Electronics'
SET @Rows = @@ROWCOUNT;
END;
注意:除非需要,否则目前避免使用 RawSql
免责声明:我是项目的所有者Entity Framework Plus
目前无法使用 BatchSize
进行更新。
但是,我们会考虑并提供此功能。
功能发布后我会更新此答案。
编辑:答案更新
从 v3.0.61 开始,SQL 服务器现在支持 BatchSize
选项。
您现在可以在使用 UpdateFromQuery
BatchSize