【问题标题】:C# Entity Framework: Update Only First Batch Records and StopC# 实体框架:仅更新第一批记录并停止
【发布时间】:2020-08-20 23:16:12
【问题描述】:

EF Core Bulk 扩展有没有办法只更新前几 10000 行?写消息,更新下一批,循环写消息直到完成?

我知道有Batch Size,但是如果只有500万要更新,我只想更新一定数量,写一条消息,不断循环直到完成,怎么办?

我应该使用 Top 还是 Take?

我想写“你好”,每隔几批。

while {

await _dbContext.Set<Product>()
    .Where(x => x.Manufacturer == "ABC Company" &&
                x.StartYear == 2019 &&
                x.ProductType.ProductTypeDescription == "Electronics")
    .BatchUpdateAsync(x => new Product(){
                Manufacturer = "XYZ Company",
                StartYear = 2020 });

Console.WriteLine("hello"):

https://github.com/borisdj/EFCore.BulkExtensions

使用 EF Core 3.1。

公司不想使用 SignalR

【问题讨论】:

标签: c# .net .net-core entity-framework-core


【解决方案1】:

看起来 BatchSize 仅用于批量插入。对于更新,表达式被转换为单个 SQL UPDATE 语句,它不按“批处理”操作。

【讨论】:

【解决方案2】:

试试这个。

if 循环直到前几个 10,000

int iEnd = 5;

for (var i = 0; i <= iEnd; i++)
{
    var products = await _dbContext.Set<Product>().Where(x => x.Manufacturer == "ABC Company" &&
                    x.StartYear == 2019 &&
                    x.ProductType.ProductTypeDescription == "Electronics").Skip(i * 10000).Take(10000).ToList();

    products.ForEach(x =>
    {
         x.Manufacturer = "XYZ Company";
         x.StartYear = 2020;
    });
    _dbContext.Set<Product>().UpdateRange(products); // or you can use BulkUpdate here.
}

_dbContext.SaveChanges();

如果循环到 500 万。

int i = 0;
Boolean IsContinue = true;
while (IsContinue)
{
     var products = await _dbContext.Set<Product>().Where(x => x.Manufacturer == "ABC Company" &&
                x.StartYear == 2019 &&
                x.ProductType.ProductTypeDescription == "Electronics").Skip(i * 10000).Take(10000).ToList();

     if (products.Count() == 0)
          IsContinue = false;
     else
     {
          products.ForEach(x =>
          {
                x.Manufacturer = "XYZ Company";
                x.StartYear = 2020;
          });
          _dbContext.Set<Product>().UpdateRange(products); // or you can use BulkUpdate here.
      }
      i++;
}

_dbContext.SaveChanges();

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2017-08-07
    相关资源
    最近更新 更多