-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Closed as duplicate of#35401
Labels
Description
There is the following code
public void ChangeDescription()
{
int skip = 0;
Temp[] response;
int count = 0;
do
{
response = dbContext.TempDbContext.
.OrderBy(a => a.Id)
.Skip(skip)
.Take(1000)
.ToArray();
Console.WriteLine("Start");
foreach (var item in response)
{
Console.WriteLine($"Desc:{count++}");
item.DescriptionJoin = ChangeJsonTitleAndDescription(item.Description, item.UpdateDescriptionInfo, item.UpdateDescriptionLanguageInfo);
;
}
dbContext.SaveChanges();
dbContext.ChangeTracker.Clear();
skip += 1000;
}
while (response.Any());
}
this code generates the following sql query
UPDATE temp SET "DescriptionJoin" = @p1782
WHERE "Id" = @p1783;
UPDATE wikimedia SET "DescriptionJoin" = @p1784
WHERE "Id" = @p1785;
UPDATE wikimedia SET "DescriptionJoin" = @p1786
WHERE "Id" = @p1787;
UPDATE wikimedia SET "DescriptionJoin" = @p1788
WHERE "Id" = @p1789;
UPDATE wikimedia SET "DescriptionJoin" = @p1790
WHERE "Id" = @p1791;
UPDATE wikimedia SET "DescriptionJoin" = @p1792
WHERE "Id" = @p1793;
UPDATE wikimedia SET "DescriptionJoin" = @p1794
WHERE "Id" = @p1795;
In these sql queries, minus what is here, the operation of filtering data by id is repeated, and it all does not work very well.
The following sql can be generated
UPDATE temp
SET "DescriptionJoin" = CASE
WHEN "Id" = @p1783 THEN @p1782
WHEN "Id" = @p1785 THEN @p1784
WHEN "Id" = @p1787 THEN @p1786
WHEN "Id" = @p1789 THEN @p1788
WHEN "Id" = @p1791 THEN @p1790
WHEN "Id" = @p1793 THEN @p1792
WHEN "Id" = @p1795 THEN @p1794
ELSE "DescriptionJoin"
END
WHERE "Id" IN (@p1783, @p1785, @p1787, @p1789, @p1791, @p1793, @p1795);
Such code should, in theory, run many times faster than generating many update requests.