Skip to content

Generating a sql query #35387

@Mr0N

Description

@Mr0N

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions