ParameterInsertable.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public class ParameterInsertable<T> : IParameterInsertable<T> where T:class,new()
  9. {
  10. internal IInsertable<T> Inserable { get; set; }
  11. internal SqlSugarProvider Context { get; set; }
  12. public int ExecuteCommand()
  13. {
  14. if (this.Context.CurrentConnectionConfig.DbType.IsIn(DbType.Oracle, DbType.Dm))
  15. {
  16. return DefaultExecuteCommand();
  17. }
  18. else
  19. {
  20. return ValuesExecuteCommand();
  21. }
  22. }
  23. public async Task<int> ExecuteCommandAsync()
  24. {
  25. if (this.Context.CurrentConnectionConfig.DbType.IsIn(DbType.Oracle, DbType.Dm))
  26. {
  27. return await DefaultExecuteCommandAsync();
  28. }
  29. else
  30. {
  31. return await ValuesExecuteCommandAsync();
  32. }
  33. }
  34. public int DefaultExecuteCommand()
  35. {
  36. int result = 0;
  37. var inserable = Inserable as InsertableProvider<T>;
  38. var columns= inserable.InsertBuilder.DbColumnInfoList.GroupBy(it => it.DbColumnName).Select(it=>it.Key).Distinct().ToList();
  39. var tableWithString = inserable.InsertBuilder.TableWithString;
  40. var removeCacheFunc = inserable.RemoveCacheFunc;
  41. var objects = inserable.InsertObjs;
  42. this.Context.Utilities.PageEach(objects, 60, pagelist =>
  43. {
  44. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  45. this.Context.AddQueue("begin");
  46. foreach (var item in pagelist)
  47. {
  48. var itemable = this.Context.Insertable(item);
  49. itemable.InsertBuilder.DbColumnInfoList = itemable.InsertBuilder.DbColumnInfoList.Where(it => columns.Contains(it.DbColumnName)).ToList();
  50. itemable.InsertBuilder.TableWithString = tableWithString;
  51. itemable.InsertBuilder.AsName = Inserable.InsertBuilder.AsName;
  52. (itemable as InsertableProvider<T>).RemoveCacheFunc = removeCacheFunc;
  53. itemable.AddQueue();
  54. }
  55. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  56. this.Context.AddQueue("end \r\n");
  57. result +=this.Context.SaveQueues(false);
  58. });
  59. //if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  60. // result=objects.Length;
  61. if (result == -1)
  62. {
  63. result = objects.Length;
  64. }
  65. return result;
  66. }
  67. public async Task<int> DefaultExecuteCommandAsync()
  68. {
  69. int result = 0;
  70. var inserable = Inserable as InsertableProvider<T>;
  71. var columns = inserable.InsertBuilder.DbColumnInfoList.GroupBy(it => it.DbColumnName).Select(it => it.Key).Distinct().ToList();
  72. var tableWithString = inserable.InsertBuilder.TableWithString;
  73. var removeCacheFunc = inserable.RemoveCacheFunc;
  74. var objects = inserable.InsertObjs;
  75. await this.Context.Utilities.PageEachAsync<T,int>(objects, 60,async pagelist =>
  76. {
  77. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  78. this.Context.AddQueue("begin");
  79. foreach (var item in pagelist)
  80. {
  81. var itemable = this.Context.Insertable(item);
  82. itemable.InsertBuilder.DbColumnInfoList = itemable.InsertBuilder.DbColumnInfoList.Where(it => columns.Contains(it.DbColumnName)).ToList();
  83. itemable.InsertBuilder.TableWithString = tableWithString;
  84. itemable.InsertBuilder.AsName = Inserable.InsertBuilder.AsName;
  85. (itemable as InsertableProvider<T>).RemoveCacheFunc = removeCacheFunc;
  86. itemable.AddQueue();
  87. }
  88. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  89. this.Context.AddQueue("end");
  90. result += await this.Context.SaveQueuesAsync(false);
  91. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  92. result= objects.Length;
  93. return result;
  94. });
  95. return result;
  96. }
  97. public int ValuesExecuteCommand()
  98. {
  99. int result = 0;
  100. var inserable = Inserable as InsertableProvider<T>;
  101. var columns = inserable.InsertBuilder.DbColumnInfoList.GroupBy(it => it.DbColumnName).Select(it => it.Key).Distinct().ToList();
  102. var tableWithString = inserable.InsertBuilder.TableWithString;
  103. var removeCacheFunc = inserable.RemoveCacheFunc;
  104. var objects = inserable.InsertObjs;
  105. if (objects == null || objects.Count() == 0 || (objects.Count() == 1 && objects.First() == null))
  106. {
  107. return result;
  108. }
  109. var identityList = inserable.EntityInfo.Columns.Where(it => it.IsIdentity).Select(it => it.PropertyName).ToArray();
  110. if (inserable.IsOffIdentity)
  111. {
  112. identityList = new string[] { };
  113. }
  114. var pageSize = 100;
  115. var count = inserable.EntityInfo.Columns.Count();
  116. pageSize = GetPageSize(pageSize, count);
  117. this.Context.Utilities.PageEach(objects, pageSize, pagelist =>
  118. {
  119. StringBuilder batchInsetrSql;
  120. List<SugarParameter> allParamter=new List<SugarParameter>();
  121. GetInsertValues(identityList,columns, tableWithString, removeCacheFunc, pagelist, out batchInsetrSql, allParamter);
  122. result += this.Context.Ado.ExecuteCommand(batchInsetrSql.ToString(), allParamter);
  123. });
  124. return result;
  125. }
  126. public async Task<int> ValuesExecuteCommandAsync()
  127. {
  128. int result = 0;
  129. var inserable = Inserable as InsertableProvider<T>;
  130. var columns = inserable.InsertBuilder.DbColumnInfoList.GroupBy(it => it.DbColumnName).Select(it => it.Key).Distinct().ToList();
  131. var tableWithString = inserable.InsertBuilder.TableWithString;
  132. var removeCacheFunc = inserable.RemoveCacheFunc;
  133. var objects = inserable.InsertObjs;
  134. var identityList = inserable.EntityInfo.Columns.Where(it => it.IsIdentity).Select(it => it.PropertyName).ToArray();
  135. if (inserable.IsOffIdentity)
  136. {
  137. identityList = new string[] { };
  138. }
  139. await this.Context.Utilities.PageEachAsync(objects, 100,async pagelist =>
  140. {
  141. StringBuilder batchInsetrSql;
  142. List<SugarParameter> allParamter = new List<SugarParameter>();
  143. GetInsertValues(identityList, columns, tableWithString, removeCacheFunc, pagelist, out batchInsetrSql, allParamter);
  144. result +=await this.Context.Ado.ExecuteCommandAsync(batchInsetrSql.ToString(), allParamter);
  145. });
  146. return result;
  147. }
  148. #region Values Helper
  149. private static int GetPageSize(int pageSize, int count)
  150. {
  151. if (pageSize * count > 2100)
  152. {
  153. pageSize = 50;
  154. }
  155. if (pageSize * count > 2100)
  156. {
  157. pageSize = 20;
  158. }
  159. if (pageSize * count > 2100)
  160. {
  161. pageSize = 10;
  162. }
  163. return pageSize;
  164. }
  165. private void GetInsertValues(string[] identitys, List<string> columns, string tableWithString, Action removeCacheFunc, List<T> items, out StringBuilder batchInsetrSql, List<SugarParameter> allParamter)
  166. {
  167. var itemable = this.Context.Insertable(items);
  168. itemable.InsertBuilder.DbColumnInfoList = itemable.InsertBuilder.DbColumnInfoList.Where(it => columns.Contains(it.DbColumnName)).ToList();
  169. itemable.InsertBuilder.TableWithString = tableWithString;
  170. (itemable as InsertableProvider<T>).RemoveCacheFunc = removeCacheFunc;
  171. batchInsetrSql = new StringBuilder();
  172. batchInsetrSql.Append("INSERT INTO " + itemable.InsertBuilder.GetTableNameString + " ");
  173. batchInsetrSql.Append("(");
  174. var groupList = itemable.InsertBuilder.DbColumnInfoList.Where(it => !identitys.Contains(it.PropertyName)).GroupBy(it => it.TableId).ToList();
  175. string columnsString = string.Join(",", groupList.First().Select(it => itemable.InsertBuilder.Builder.GetTranslationColumnName(it.DbColumnName)));
  176. batchInsetrSql.Append(columnsString);
  177. batchInsetrSql.Append(") VALUES");
  178. string insertColumns = "";
  179. foreach (var gitem in groupList)
  180. {
  181. batchInsetrSql.Append("(");
  182. insertColumns = string.Join(",", gitem.Select(it => FormatValue(it.PropertyType,it.DbColumnName, it.Value, allParamter, itemable.InsertBuilder.Builder.SqlParameterKeyWord)));
  183. batchInsetrSql.Append(insertColumns);
  184. if (groupList.Last() == gitem)
  185. {
  186. batchInsetrSql.Append(") ");
  187. }
  188. else
  189. {
  190. batchInsetrSql.Append("), ");
  191. }
  192. }
  193. }
  194. private string FormatValue(Type type,string name, object value, List<SugarParameter> allParamter, string keyword)
  195. {
  196. var result = keyword + name + allParamter.Count;
  197. var addParameter = new SugarParameter(result, value,type);
  198. allParamter.Add(addParameter);
  199. return result;
  200. }
  201. #endregion
  202. }
  203. }