diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 79ed4b33c..37ee1ed49 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -58,12 +58,22 @@ namespace SqlSugar foreach (var deleteObj in deleteObjs) { var entityPropertyName = this.Context.EntityProvider.GetPropertyName(primaryField); - var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName.Equals(entityPropertyName,StringComparison.CurrentCultureIgnoreCase)); + var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName.Equals(entityPropertyName, StringComparison.CurrentCultureIgnoreCase)); var value = columnInfo.PropertyInfo.GetValue(deleteObj, null); primaryKeyValues.Add(value); } - var inValueString = primaryKeyValues.ToArray().ToJoinSqlInVals(); - Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryFields.Single()), inValueString)); + if (primaryKeyValues.Count < 10000) + { + var inValueString = primaryKeyValues.ToArray().ToJoinSqlInVals(); + Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryFields.Single()), inValueString)); + } + else + { + if (DeleteBuilder.BigDataInValues == null) + DeleteBuilder.BigDataInValues = new List(); + DeleteBuilder.BigDataInValues.AddRange(primaryKeyValues); + DeleteBuilder.BigDataFiled = primaryField; + } } else { @@ -159,7 +169,17 @@ namespace SqlSugar string primaryField = null; primaryField = GetPrimaryKeys().FirstOrDefault(); Check.ArgumentNullException(primaryField, "Table " + tableName + " with no primarykey"); - Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryField), primaryKeyValues.ToJoinSqlInVals())); + if (primaryKeyValues.Length < 10000) + { + Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryField), primaryKeyValues.ToJoinSqlInVals())); + } + else + { + if (DeleteBuilder.BigDataInValues == null) + DeleteBuilder.BigDataInValues = new List(); + DeleteBuilder.BigDataInValues.AddRange(primaryKeyValues.Select(it=>(object)it)); + DeleteBuilder.BigDataFiled = primaryField; + } return this; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs index 3fb867aa7..88b115dd8 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs @@ -28,6 +28,8 @@ namespace SqlSugar } set { _WhereInfos = value; } } + public virtual List BigDataInValues { get; set; } + public virtual string BigDataFiled { get; set; } #endregion #region Sql Template @@ -115,7 +117,29 @@ namespace SqlSugar } public virtual string ToSqlString() { - return string.Format(SqlTemplate, GetTableNameString, GetWhereString); + if (this.BigDataInValues.IsNullOrEmpty()) + { + return string.Format(SqlTemplate, GetTableNameString, GetWhereString); + } + else//big data + { + var whereString = GetWhereString; + var sql = string.Format(SqlTemplate, GetTableNameString, whereString); + sql += whereString.IsNullOrEmpty() ? " WHERE " : " AND "; + StringBuilder batchDeleteSql = new StringBuilder(); + int pageSize = 1000; + int pageIndex = 1; + int totalRecord = this.BigDataInValues.Count; + int pageCount = (totalRecord + pageSize - 1) / pageSize; + while (pageCount >= pageIndex) + { + var inValues = this.BigDataInValues.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); + batchDeleteSql.Append(sql+string.Format(WhereInTemplate,BigDataFiled,inValues.ToArray().ToJoinSqlInVals())); + batchDeleteSql.Append(";"); + pageIndex++; + } + return batchDeleteSql.ToString(); + } } public virtual ExpressionResult GetExpressionValue(Expression expression, ResolveExpressType resolveType) {