Delete large data optimization

This commit is contained in:
sunkaixuan 2017-08-07 13:17:51 +08:00
parent 473c84aecf
commit 5e0b2d5c68
2 changed files with 49 additions and 5 deletions

View File

@ -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;
}

View File

@ -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)
{