mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-05-03 04:13:48 +08:00
Delete large data optimization
This commit is contained in:
parent
473c84aecf
commit
5e0b2d5c68
@ -58,12 +58,22 @@ namespace SqlSugar
|
||||
foreach (var deleteObj in deleteObjs)
|
||||
{
|
||||
var entityPropertyName = this.Context.EntityProvider.GetPropertyName<T>(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<object>();
|
||||
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<object>();
|
||||
DeleteBuilder.BigDataInValues.AddRange(primaryKeyValues.Select(it=>(object)it));
|
||||
DeleteBuilder.BigDataFiled = primaryField;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,8 @@ namespace SqlSugar
|
||||
}
|
||||
set { _WhereInfos = value; }
|
||||
}
|
||||
public virtual List<object> 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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user