KdbndpUpdateBuilder.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar
  6. {
  7. public class KdbndpUpdateBuilder : UpdateBuilder
  8. {
  9. public override string SqlTemplateBatch
  10. {
  11. get
  12. {
  13. return @"UPDATE {1} {2} SET {0} FROM ${{0}} ";
  14. }
  15. }
  16. public override string SqlTemplateJoin
  17. {
  18. get
  19. {
  20. return @" (VALUES
  21. {0}
  22. ) AS T ({2}) WHERE {1}
  23. ";
  24. }
  25. }
  26. public override string SqlTemplateBatchUnion
  27. {
  28. get
  29. {
  30. return ",";
  31. }
  32. }
  33. public override object FormatValue(object value)
  34. {
  35. if (value == null)
  36. {
  37. return "NULL";
  38. }
  39. else
  40. {
  41. var type = UtilMethods.GetUnderType(value.GetType());
  42. if (type == UtilConstants.DateType)
  43. {
  44. var date = value.ObjToDate();
  45. if (date < Convert.ToDateTime("1900-1-1"))
  46. {
  47. date = Convert.ToDateTime("1900-1-1");
  48. }
  49. return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
  50. }
  51. else if (type == UtilConstants.DateTimeOffsetType)
  52. {
  53. return FormatDateTimeOffset(value);
  54. }
  55. else if (type == UtilConstants.ByteArrayType)
  56. {
  57. string bytesString = "0x" + BitConverter.ToString((byte[])value);
  58. return bytesString;
  59. }
  60. else if (type.IsEnum())
  61. {
  62. return Convert.ToInt64(value);
  63. }
  64. else if (type == UtilConstants.BoolType)
  65. {
  66. return value.ObjToBool() ? "1" : "0";
  67. }
  68. else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
  69. {
  70. return "'" + value.ToString().ToSqlFilter() + "'";
  71. }
  72. else
  73. {
  74. return "'" + value.ToString() + "'";
  75. }
  76. }
  77. }
  78. protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList)
  79. {
  80. Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List<T> need Primary key");
  81. int pageSize = 200;
  82. int pageIndex = 1;
  83. int totalRecord = groupList.Count;
  84. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  85. StringBuilder batchUpdateSql = new StringBuilder();
  86. while (pageCount >= pageIndex)
  87. {
  88. StringBuilder updateTable = new StringBuilder();
  89. string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it =>
  90. {
  91. if (SetValues.IsValuable())
  92. {
  93. var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName));
  94. if (setValue != null && setValue.Any())
  95. {
  96. return setValue.First().Value;
  97. }
  98. }
  99. var result = string.Format("{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName));
  100. return result;
  101. }));
  102. string tempColumnValue = string.Join(",", groupList.First().Select(it =>
  103. {
  104. if (SetValues.IsValuable())
  105. {
  106. var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName));
  107. if (setValue != null && setValue.Any())
  108. {
  109. return setValue.First().Value;
  110. }
  111. }
  112. var result = Builder.GetTranslationColumnName(it.DbColumnName);
  113. return result;
  114. }));
  115. batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString);
  116. int i = 0;
  117. var tableColumnList = this.Context.DbMaintenance.GetColumnInfosByTableName(GetTableNameStringNoWith);
  118. foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
  119. {
  120. var isFirst = i == 0;
  121. if (!isFirst)
  122. {
  123. updateTable.Append(SqlTemplateBatchUnion);
  124. }
  125. updateTable.Append("\r\n (" + string.Join(",", columns.Select(it =>
  126. {
  127. var columnInfo = tableColumnList.FirstOrDefault(x => x.DbColumnName.Equals(it.DbColumnName, StringComparison.OrdinalIgnoreCase));
  128. var dbType = columnInfo?.DataType;
  129. if (dbType == null) {
  130. var typeName = it.PropertyType.Name.ToLower();
  131. if (typeName == "int32")
  132. typeName = "int";
  133. if (typeName == "int64")
  134. typeName = "long";
  135. if (typeName == "int16")
  136. typeName = "short";
  137. if (typeName == "boolean")
  138. typeName = "bool";
  139. var isAnyType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).Any();
  140. if (isAnyType)
  141. {
  142. dbType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).FirstOrDefault().Key;
  143. }
  144. else {
  145. dbType = "varchar";
  146. }
  147. }
  148. return string.Format("CAST({0} AS {1})", base.GetDbColumn(it,FormatValue(it.Value)), dbType);
  149. })) + ")");
  150. ++i;
  151. }
  152. pageIndex++;
  153. updateTable.Append("\r\n");
  154. string whereString = null;
  155. if (this.WhereValues.HasValue())
  156. {
  157. foreach (var item in WhereValues)
  158. {
  159. var isFirst = whereString == null;
  160. whereString += (isFirst ? null : " AND ");
  161. whereString += item;
  162. }
  163. }
  164. else if (PrimaryKeys.HasValue())
  165. {
  166. foreach (var item in PrimaryKeys)
  167. {
  168. var isFirst = whereString == null;
  169. whereString += (isFirst ? null : " AND ");
  170. whereString += string.Format("{0}.{1}=T.{1}", GetTableNameStringNoWith, Builder.GetTranslationColumnName(item));
  171. }
  172. }
  173. var format = string.Format(SqlTemplateJoin, updateTable, whereString, tempColumnValue);
  174. batchUpdateSql.Replace("${0}", format);
  175. batchUpdateSql.Append(";");
  176. }
  177. batchUpdateSql = GetBatchUpdateSql(batchUpdateSql);
  178. return batchUpdateSql.ToString();
  179. }
  180. private StringBuilder GetBatchUpdateSql(StringBuilder batchUpdateSql)
  181. {
  182. if (ReSetValueBySqlExpListType == null && ReSetValueBySqlExpList != null)
  183. {
  184. var result = batchUpdateSql.ToString();
  185. foreach (var item in ReSetValueBySqlExpList)
  186. {
  187. var dbColumnName = item.Value.DbColumnName;
  188. if (item.Value.Type == ReSetValueBySqlExpListModelType.List)
  189. {
  190. result = result.Replace($"{dbColumnName}=T.{dbColumnName}", $"{dbColumnName}={GetTableNameString}.{dbColumnName}{item.Value.Sql}T.{dbColumnName}");
  191. }
  192. else
  193. {
  194. result = result.Replace($"{dbColumnName}=T.{dbColumnName}", $"{dbColumnName}={item.Value.Sql.Replace(dbColumnName, $"{Builder.GetTranslationColumnName(this.TableName)}.{dbColumnName}")}");
  195. }
  196. batchUpdateSql = new StringBuilder(result);
  197. }
  198. }
  199. return batchUpdateSql;
  200. }
  201. protected override string GetJoinUpdate(string columnsString, ref string whereString)
  202. {
  203. var formString = $" {Builder.GetTranslationColumnName(this.TableName)} AS {Builder.GetTranslationColumnName(this.ShortName)} ";
  204. var joinString = "";
  205. foreach (var item in this.JoinInfos)
  206. {
  207. whereString += " AND " + item.JoinWhere;
  208. joinString += $"\r\n FROM {Builder.GetTranslationColumnName(item.TableName)} {Builder.GetTranslationColumnName(item.ShortName)} ";
  209. }
  210. var tableName = formString + "\r\n ";
  211. columnsString = columnsString.Replace(Builder.GetTranslationColumnName(this.ShortName) + ".", "") + joinString;
  212. return string.Format(SqlTemplate, tableName, columnsString, whereString);
  213. }
  214. public override string FormatDateTimeOffset(object value)
  215. {
  216. var date = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
  217. return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff zzz") + "'";
  218. }
  219. }
  220. }