ExecuteUpdateTranslateService.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Vitorm.Sql.SqlTranslate;
  5. using Vitorm.StreamQuery;
  6. namespace Vitorm.Sqlite.TranslateService
  7. {
  8. public class ExecuteUpdateTranslateService : BaseQueryTranslateService
  9. {
  10. /*
  11. -- multiple
  12. WITH tmp AS (
  13. select ('u' || u.id || '_' || COALESCE(father.id,'') ) as _name , u.id
  14. from User u
  15. left join User father on u.fatherId = father.id
  16. where u.id > 0
  17. )
  18. UPDATE User
  19. SET name = ( SELECT _name FROM tmp WHERE tmp.id =User.id )
  20. where id in ( SELECT id FROM tmp );
  21. --- single
  22. UPDATE User SET name = 'u'||id where id > 0;
  23. */
  24. public override string BuildQuery(QueryTranslateArgument arg, CombinedStream stream)
  25. {
  26. var sqlInner = base.BuildQuery(arg, stream);
  27. var entityDescriptor = arg.dbContext.GetEntityDescriptor(arg.resultEntityType);
  28. var columnsToUpdate = (stream as StreamToUpdate)?.fieldsToUpdate?.memberArgs;
  29. var NewLine = "\r\n";
  30. var keyName = entityDescriptor.keyName;
  31. var tableName = entityDescriptor.tableName;
  32. var sql = $"WITH tmp AS ( {NewLine}";
  33. sql += sqlInner;
  34. sql += $"{NewLine}){NewLine}";
  35. sql += $"UPDATE {sqlTranslator.DelimitIdentifier(tableName)}{NewLine}";
  36. sql += $"Set ";
  37. var sqlToUpdateCols = columnsToUpdate
  38. .Select(m => m.name)
  39. .Select(name => $"{NewLine} {sqlTranslator.DelimitIdentifier(name)} = (SELECT {sqlTranslator.DelimitIdentifier("_" + name)} FROM tmp WHERE tmp.{sqlTranslator.DelimitIdentifier(keyName)} ={sqlTranslator.GetSqlField(tableName, keyName)} )");
  40. sql += string.Join(",", sqlToUpdateCols);
  41. sql += $"{NewLine}where {sqlTranslator.DelimitIdentifier(keyName)} in ( SELECT {sqlTranslator.DelimitIdentifier(keyName)} FROM tmp ); {NewLine}";
  42. return sql;
  43. }
  44. public ExecuteUpdateTranslateService(SqlTranslateService sqlTranslator) : base(sqlTranslator)
  45. {
  46. }
  47. protected override string ReadSelect(QueryTranslateArgument arg, CombinedStream stream, string prefix = "select")
  48. {
  49. var entityDescriptor = arg.dbContext.GetEntityDescriptor(arg.resultEntityType);
  50. var columnsToUpdate = (stream as StreamToUpdate) ?.fieldsToUpdate?.memberArgs;
  51. if (columnsToUpdate?.Any() != true) throw new ArgumentException("can not get columns to update");
  52. var sqlFields = new List<string>();
  53. foreach (var column in columnsToUpdate)
  54. {
  55. sqlFields.Add($"({sqlTranslator.EvalExpression( arg, column.value)}) as {sqlTranslator.DelimitIdentifier("_" + column.name)}");
  56. }
  57. // primary key
  58. sqlFields.Add($"{sqlTranslator.GetSqlField(stream.source.alias, entityDescriptor.keyName)} as {sqlTranslator.DelimitIdentifier(entityDescriptor.keyName)}");
  59. return prefix + " " + String.Join(",", sqlFields);
  60. }
  61. }
  62. }