mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-19 18:22:23 +08:00
Delete large data optimization
This commit is contained in:
@@ -58,12 +58,22 @@ namespace SqlSugar
|
|||||||
foreach (var deleteObj in deleteObjs)
|
foreach (var deleteObj in deleteObjs)
|
||||||
{
|
{
|
||||||
var entityPropertyName = this.Context.EntityProvider.GetPropertyName<T>(primaryField);
|
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);
|
var value = columnInfo.PropertyInfo.GetValue(deleteObj, null);
|
||||||
primaryKeyValues.Add(value);
|
primaryKeyValues.Add(value);
|
||||||
}
|
}
|
||||||
var inValueString = primaryKeyValues.ToArray().ToJoinSqlInVals();
|
if (primaryKeyValues.Count < 10000)
|
||||||
Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryFields.Single()), inValueString));
|
{
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -159,7 +169,17 @@ namespace SqlSugar
|
|||||||
string primaryField = null;
|
string primaryField = null;
|
||||||
primaryField = GetPrimaryKeys().FirstOrDefault();
|
primaryField = GetPrimaryKeys().FirstOrDefault();
|
||||||
Check.ArgumentNullException(primaryField, "Table " + tableName + " with no primarykey");
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,6 +28,8 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
set { _WhereInfos = value; }
|
set { _WhereInfos = value; }
|
||||||
}
|
}
|
||||||
|
public virtual List<object> BigDataInValues { get; set; }
|
||||||
|
public virtual string BigDataFiled { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Sql Template
|
#region Sql Template
|
||||||
@@ -115,7 +117,29 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
public virtual string ToSqlString()
|
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)
|
public virtual ExpressionResult GetExpressionValue(Expression expression, ResolveExpressType resolveType)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user