AnswerBun.com

C# Entity Framework: Update Only First Batch Records and Stop

Stack Overflow Asked by Artportraitdesign1 on August 29, 2020

Is there way with EF Core Bulk extensions to only update first few 10000 rows? write message, update next batch, write message in loop until complete?

I know there is Batch Size, however if there is only 5 million to update, and I want only update a certain amount, write a message, in continual loop until complete, how can this be done?

Should I use Top or Take?

I want to write "Hello", every few batches.

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

Using EF Core 3.1.

Company does not want to use SignalR

2 Answers

It looks like BatchSize is only used for bulk insert. For update the expression is translated to a single SQL UPDATE statement, which doesn't operate by "batches".

Correct answer by David Browne - Microsoft on August 29, 2020

Try this.

if loop until first few 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();

If loop until 5 millions.

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();

Answered by Asherguru on August 29, 2020

Add your own answers!

Related Questions

Main Thread Checker Error: Double to UILabel Fails Swift

1  Asked on December 13, 2021 by nisse82

     

Can’t create bitmap without Color space android

1  Asked on December 13, 2021 by iheb-404-notfound

       

fetch id who have register all adv

1  Asked on December 11, 2021 by user13974528

   

Is there a better way to write this snippet in python?

3  Asked on December 11, 2021 by paulo-sergio-schlogl

 

How to set if-else statement in a React function Return()?

4  Asked on December 11, 2021 by buffaurus

   

Check if the next item is 1 unit longer (Javascript)

3  Asked on December 11, 2021 by ekhi-arzac

   

adding onclick to an array of items

5  Asked on December 11, 2021 by helpmepiliizz

       

How to make sure only 1 thread is running? C++

1  Asked on December 11, 2021 by lordi1000

   

Ask a Question

Get help from others!

© 2023 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP