You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

168 lines
5.6 KiB

using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
public class DeleteBuilder : IDMLBuilder
{
#region Fields
private List<string> _WhereInfos;
#endregion
#region Common Properties
public EntityInfo EntityInfo { get; set; }
public SqlSugarClient Context { get; set; }
public ILambdaExpressions LambdaExpressions { get; set; }
public List<SugarParameter> Parameters { get; set; }
public StringBuilder sql { get; set; }
public ISqlBuilder Builder { get; set; }
public string TableWithString { get; set; }
public virtual List<string> WhereInfos
{
get
{
_WhereInfos = UtilMethods.IsNullReturnNew(_WhereInfos);
return _WhereInfos;
}
set { _WhereInfos = value; }
}
public virtual List<object> BigDataInValues { get; set; }
public virtual string BigDataFiled { get; set; }
#endregion
#region Sql Template
public string SqlTemplate
{
get
{
return "DELETE FROM {0}{1}";
}
}
public string WhereInTemplate
{
get
{
return "{0} IN ({1})";
}
}
public string WhereInOrTemplate
{
get
{
return "OR";
}
}
public string WhereInAndTemplate
{
get
{
return "AND";
}
}
public string WhereInEqualTemplate
{
get
{
return Builder.SqlTranslationLeft+"{0}"+Builder.SqlTranslationRight+"=N'{1}'";
}
}
public string WhereInAreaTemplate
{
get
{
return "({0})";
}
}
#endregion
#region Get Sql
public virtual string GetTableNameString
{
get
{
var result = Builder.GetTranslationTableName(EntityInfo.EntityName);
result += UtilConstants.Space;
if (this.TableWithString.HasValue())
{
result += TableWithString + UtilConstants.Space;
}
return result;
}
}
public virtual string GetWhereString
{
get
{
if (_WhereInfos == null || _WhereInfos.Count == 0) return null;
string whereString = null;
var i = 0;
foreach (var item in _WhereInfos)
{
var isFirst = i == 0;
whereString += isFirst ? "WHERE " : "AND ";
whereString += (item + UtilConstants.Space);
++i;
}
return whereString;
}
}
#endregion
#region Public methods
public virtual void Clear()
{
}
public virtual string ToSqlString()
{
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 ";
var batchDeleteSql = new StringBuilder();
var pageSize = 1000;
var pageIndex = 1;
var totalRecord = this.BigDataInValues.Count;
var 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)
{
var resolveExpress = this.LambdaExpressions;
this.LambdaExpressions.Clear();
resolveExpress.MappingColumns = Context.MappingColumns;
resolveExpress.MappingTables = Context.MappingTables;
resolveExpress.IgnoreComumnList = Context.IgnoreColumns;
resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices?.SqlFuncServices;
resolveExpress.InitMappingInfo = Context.InitMppingInfo;
resolveExpress.RefreshMapping = () =>
{
resolveExpress.MappingColumns = Context.MappingColumns;
resolveExpress.MappingTables = Context.MappingTables;
resolveExpress.IgnoreComumnList = Context.IgnoreColumns;
resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices?.SqlFuncServices;
};
resolveExpress.Resolve(expression, resolveType);
if (this.Parameters == null)
this.Parameters = new List<SugarParameter>();
this.Parameters.AddRange(resolveExpress.Parameters);
var result = resolveExpress.Result;
return result;
}
#endregion
}
}