FastBuilder.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. public class FastBuilder
  10. {
  11. public EntityInfo FastEntityInfo { get; set; }
  12. public virtual bool IsActionUpdateColumns { get; set; }
  13. public virtual DbFastestProperties DbFastestProperties { get; set; }
  14. public SqlSugarProvider Context { get; set; }
  15. public virtual string CharacterSet { get; set; }
  16. public virtual string UpdateSql { get; set; } = @"UPDATE TM
  17. SET {0}
  18. FROM {1} TM
  19. INNER JOIN {2} TE ON {3} ";
  20. public virtual void CloseDb()
  21. {
  22. if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection && this.Context.Ado.Transaction == null)
  23. {
  24. this.Context.Ado.Connection.Close();
  25. }
  26. }
  27. public virtual async Task<int> UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
  28. {
  29. var sqlbuilder = this.Context.Queryable<object>().SqlBuilder;
  30. Check.ArgumentNullException(!updateColumns.Any(), "update columns count is 0");
  31. Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0");
  32. var sets = string.Join(",", updateColumns.Select(it => $"TM.{sqlbuilder.GetTranslationColumnName(it)}=TE.{sqlbuilder.GetTranslationColumnName(it)}"));
  33. var wheres = string.Join(" AND ", whereColumns.Select(it => $"TM.{sqlbuilder.GetTranslationColumnName(it)}=TE.{sqlbuilder.GetTranslationColumnName(it)}"));
  34. string sql = string.Format(UpdateSql, sets, tableName, tempName, wheres);
  35. return await this.Context.Ado.ExecuteCommandAsync(sql);
  36. }
  37. public virtual async Task CreateTempAsync<T>(DataTable dt) where T : class, new()
  38. {
  39. var sqlbuilder = this.Context.Queryable<object>().SqlBuilder;
  40. await this.Context.UnionAll(
  41. this.Context.Queryable<T>().Filter(null,true).Select(string.Join(",", dt.Columns.Cast<DataColumn>().Select(it => sqlbuilder.GetTranslationColumnName(it.ColumnName)))).Where(it => false).AS(dt.TableName),
  42. this.Context.Queryable<T>().Filter(null, true).Select(string.Join(",", dt.Columns.Cast<DataColumn>().Select(it => sqlbuilder.GetTranslationColumnName(it.ColumnName)))).Where(it => false).AS(dt.TableName)).Select("top 1 * into #temp").ToListAsync();
  43. dt.TableName = "#temp";
  44. }
  45. public async virtual Task<int> Merge<T>(string tableName,DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns, List<T> datas) where T : class, new()
  46. {
  47. var result = 0;
  48. await this.Context.Utilities.PageEachAsync(datas,2000,async pageItems =>
  49. {
  50. var x = await this.Context.Storageable(pageItems).As(tableName).WhereColumns(whereColumns).ToStorageAsync();
  51. result += await x.BulkCopyAsync();
  52. result += await x.BulkUpdateAsync(updateColumns);
  53. return result;
  54. });
  55. return result;
  56. }
  57. }
  58. }