DeleteBuilder.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. namespace SqlSugar
  7. {
  8. public class DeleteBuilder : IDMLBuilder
  9. {
  10. #region Fields
  11. private List<string> _WhereInfos;
  12. #endregion
  13. #region Common Properties
  14. public EntityInfo EntityInfo { get; set; }
  15. public SqlSugarProvider Context { get; set; }
  16. public ILambdaExpressions LambdaExpressions { get; set; }
  17. public List<SugarParameter> Parameters { get; set; }
  18. public StringBuilder sql { get; set; }
  19. public ISqlBuilder Builder { get; set; }
  20. public string TableWithString { get; set; }
  21. public string AsName { get; set; }
  22. public virtual List<string> WhereInfos
  23. {
  24. get
  25. {
  26. _WhereInfos = UtilMethods.IsNullReturnNew(_WhereInfos);
  27. return _WhereInfos;
  28. }
  29. set { _WhereInfos = value; }
  30. }
  31. public virtual List<object> BigDataInValues { get; set; }
  32. public virtual string BigDataFiled { get; set; }
  33. #endregion
  34. #region Sql Template
  35. public virtual string SqlTemplate
  36. {
  37. get
  38. {
  39. return "DELETE FROM {0}{1}";
  40. }
  41. }
  42. public string WhereInTemplate
  43. {
  44. get
  45. {
  46. return "{0} IN ({1})";
  47. }
  48. }
  49. public string WhereInOrTemplate
  50. {
  51. get
  52. {
  53. return "OR";
  54. }
  55. }
  56. public string WhereInAndTemplate
  57. {
  58. get
  59. {
  60. return "AND";
  61. }
  62. }
  63. public string WhereInEqualTemplate
  64. {
  65. get
  66. {
  67. return Builder.SqlTranslationLeft+"{0}"+Builder.SqlTranslationRight+"=N'{1}'";
  68. }
  69. }
  70. public string WhereInAreaTemplate
  71. {
  72. get
  73. {
  74. return "({0})";
  75. }
  76. }
  77. #endregion
  78. #region Get Sql
  79. public virtual string GetTableNameString
  80. {
  81. get
  82. {
  83. var result = Builder.GetTranslationTableName(EntityInfo.EntityName);
  84. if (AsName.HasValue())
  85. {
  86. result = Builder.GetTranslationColumnName(AsName);
  87. }
  88. result += UtilConstants.Space;
  89. if (this.TableWithString.HasValue())
  90. {
  91. result += TableWithString + UtilConstants.Space;
  92. }
  93. return result;
  94. }
  95. }
  96. public virtual string GetWhereString
  97. {
  98. get
  99. {
  100. if (_WhereInfos == null || _WhereInfos.Count == 0) return null;
  101. string whereString = null;
  102. int i = 0;
  103. foreach (var item in _WhereInfos)
  104. {
  105. var isFirst = i == 0;
  106. whereString += isFirst ? "WHERE " : "AND ";
  107. whereString += (item + UtilConstants.Space);
  108. ++i;
  109. }
  110. return whereString;
  111. }
  112. }
  113. #endregion
  114. #region Public methods
  115. public virtual void Clear()
  116. {
  117. }
  118. public virtual string ToSqlString()
  119. {
  120. if (this.BigDataInValues.IsNullOrEmpty())
  121. {
  122. return string.Format(SqlTemplate, GetTableNameString, GetWhereString);
  123. }
  124. else//big data
  125. {
  126. var whereString = GetWhereString;
  127. var sql = string.Format(SqlTemplate, GetTableNameString, whereString);
  128. sql += whereString.IsNullOrEmpty() ? " WHERE " : " AND ";
  129. StringBuilder batchDeleteSql = new StringBuilder();
  130. int pageSize = 1000;
  131. int pageIndex = 1;
  132. int totalRecord = this.BigDataInValues.Count;
  133. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  134. while (pageCount >= pageIndex)
  135. {
  136. var inValues = this.BigDataInValues.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
  137. batchDeleteSql.Append(sql+string.Format(WhereInTemplate,BigDataFiled,inValues.ToArray().ToJoinSqlInVals()));
  138. batchDeleteSql.Append(";");
  139. pageIndex++;
  140. }
  141. return batchDeleteSql.ToString();
  142. }
  143. }
  144. public virtual ExpressionResult GetExpressionValue(Expression expression, ResolveExpressType resolveType)
  145. {
  146. ILambdaExpressions resolveExpress = this.LambdaExpressions;
  147. this.LambdaExpressions.Clear();
  148. if (this.Context.CurrentConnectionConfig.MoreSettings != null)
  149. {
  150. resolveExpress.TableEnumIsString = this.Context.CurrentConnectionConfig.MoreSettings.TableEnumIsString;
  151. resolveExpress.PgSqlIsAutoToLower = this.Context.CurrentConnectionConfig.MoreSettings.PgSqlIsAutoToLower;
  152. }
  153. else
  154. {
  155. resolveExpress.PgSqlIsAutoToLower = true;
  156. }
  157. resolveExpress.SugarContext = new ExpressionOutParameter() { Context = this.Context };
  158. resolveExpress.MappingColumns = Context.MappingColumns;
  159. resolveExpress.MappingTables = Context.MappingTables;
  160. resolveExpress.IgnoreComumnList = Context.IgnoreColumns;
  161. resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices;
  162. resolveExpress.InitMappingInfo = Context.InitMappingInfo;
  163. resolveExpress.RefreshMapping = () =>
  164. {
  165. resolveExpress.MappingColumns = Context.MappingColumns;
  166. resolveExpress.MappingTables = Context.MappingTables;
  167. resolveExpress.IgnoreComumnList = Context.IgnoreColumns;
  168. resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices;
  169. };
  170. resolveExpress.Resolve(expression, resolveType);
  171. if (this.Parameters == null)
  172. this.Parameters = new List<SugarParameter>();
  173. this.Parameters.AddRange(resolveExpress.Parameters);
  174. var result = resolveExpress.Result;
  175. return result;
  176. }
  177. #endregion
  178. }
  179. }