mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-06-28 13:34:32 +08:00
Code optimization
This commit is contained in:
parent
38c4c81fe3
commit
06b51a5f4e
@ -522,7 +522,7 @@ namespace SqlSugar
|
||||
}
|
||||
}
|
||||
Check.Exception(cons.IsNullOrEmpty(), "Insertable.EnableDiffLogEvent need primary key");
|
||||
var sqlable = this.Context.Utilities.ConditionalModelToSql(cons);
|
||||
var sqlable = this.SqlBuilder.ConditionalModelToSql(cons);
|
||||
whereSql = sqlable.Key;
|
||||
parameters.AddRange(sqlable.Value);
|
||||
var dt = this.Context.Queryable<T>().Where(whereSql).AddParameters(parameters).ToDataTable();
|
||||
|
@ -221,7 +221,7 @@ namespace SqlSugar
|
||||
public virtual ISugarQueryable<T> Where(List<IConditionalModel> conditionalModels)
|
||||
{
|
||||
if (conditionalModels.IsNullOrEmpty()) return this;
|
||||
var sqlObj = this.Context.Utilities.ConditionalModelToSql(conditionalModels);
|
||||
var sqlObj = this.SqlBuilder.ConditionalModelToSql(conditionalModels);
|
||||
return this.Where(sqlObj.Key, sqlObj.Value);
|
||||
}
|
||||
|
||||
|
@ -108,6 +108,153 @@ namespace SqlSugar
|
||||
{
|
||||
UtilMethods.RepairReplicationParameters(ref appendSql, parameters, addIndex);
|
||||
}
|
||||
public KeyValuePair<string, SugarParameter[]> ConditionalModelToSql(List<IConditionalModel> models, int beginIndex = 0)
|
||||
{
|
||||
if (models.IsNullOrEmpty()) return new KeyValuePair<string, SugarParameter[]>();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
List<SugarParameter> parameters = new List<SugarParameter>();
|
||||
var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
|
||||
foreach (var model in models)
|
||||
{
|
||||
if (model is ConditionalModel)
|
||||
{
|
||||
var item = model as ConditionalModel;
|
||||
var index = models.IndexOf(item) + beginIndex;
|
||||
var type = index == 0 ? "" : "AND";
|
||||
if (beginIndex > 0)
|
||||
{
|
||||
type = null;
|
||||
}
|
||||
string temp = " {0} {1} {2} {3} ";
|
||||
string parameterName = string.Format("{0}Conditional{1}{2}", sqlBuilder.SqlParameterKeyWord, item.FieldName, index);
|
||||
if (parameterName.Contains("."))
|
||||
{
|
||||
parameterName = parameterName.Replace(".", "_");
|
||||
}
|
||||
switch (item.ConditionalType)
|
||||
{
|
||||
case ConditionalType.Equal:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.Like:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, "%" + item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.GreaterThan:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), ">", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.GreaterThanOrEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), ">=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.LessThan:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.LessThanOrEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.In:
|
||||
if (item.FieldValue == null) item.FieldValue = string.Empty;
|
||||
var inValue1 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")");
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "IN", inValue1);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.NotIn:
|
||||
if (item.FieldValue == null) item.FieldValue = string.Empty;
|
||||
var inValue2 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")");
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "NOT IN", inValue2);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.LikeLeft:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.NoLike:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), " NOT LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.LikeRight:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, "%" + item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.NoEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.IsNullOrEmpty:
|
||||
builder.AppendFormat("{0} ({1}) OR ({2}) ", type, item.FieldName.ToSqlFilter() + " IS NULL ", item.FieldName.ToSqlFilter() + " = '' ");
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.IsNot:
|
||||
if (item.FieldValue == null)
|
||||
{
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), " IS NOT ", "NULL");
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var item = model as ConditionalCollections;
|
||||
if (item != null && item.ConditionalList.HasValue())
|
||||
{
|
||||
foreach (var con in item.ConditionalList)
|
||||
{
|
||||
var index = item.ConditionalList.IndexOf(con);
|
||||
var isFirst = index == 0;
|
||||
var isLast = index == (item.ConditionalList.Count - 1);
|
||||
if (models.IndexOf(item) == 0 && index == 0 && beginIndex == 0)
|
||||
{
|
||||
builder.AppendFormat(" ( ");
|
||||
|
||||
}
|
||||
else if (isFirst)
|
||||
{
|
||||
builder.AppendFormat(" {0} ( ", con.Key.ToString().ToUpper());
|
||||
}
|
||||
List<IConditionalModel> conModels = new List<IConditionalModel>();
|
||||
conModels.Add(con.Value);
|
||||
var childSqlInfo = ConditionalModelToSql(conModels, 1000 * (1 + index) + models.IndexOf(item));
|
||||
if (!isFirst)
|
||||
{
|
||||
|
||||
builder.AppendFormat(" {0} ", con.Key.ToString().ToUpper());
|
||||
}
|
||||
builder.Append(childSqlInfo.Key);
|
||||
parameters.AddRange(childSqlInfo.Value);
|
||||
if (isLast)
|
||||
{
|
||||
builder.Append(" ) ");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new KeyValuePair<string, SugarParameter[]>(builder.ToString(), parameters.ToArray());
|
||||
}
|
||||
|
||||
private static object GetFieldValue(ConditionalModel item)
|
||||
{
|
||||
if (item.FieldValueConvertFunc != null)
|
||||
return item.FieldValueConvertFunc(item.FieldValue);
|
||||
else
|
||||
return item.FieldValue;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Common SqlTemplate
|
||||
|
@ -348,156 +348,6 @@ namespace SqlSugar
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Query
|
||||
public KeyValuePair<string, SugarParameter[]> ConditionalModelToSql(List<IConditionalModel> models, int beginIndex = 0)
|
||||
{
|
||||
if (models.IsNullOrEmpty()) return new KeyValuePair<string, SugarParameter[]>();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
List<SugarParameter> parameters = new List<SugarParameter>();
|
||||
var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
|
||||
foreach (var model in models)
|
||||
{
|
||||
if (model is ConditionalModel)
|
||||
{
|
||||
var item = model as ConditionalModel;
|
||||
var index = models.IndexOf(item) + beginIndex;
|
||||
var type = index == 0 ? "" : "AND";
|
||||
if (beginIndex > 0)
|
||||
{
|
||||
type = null;
|
||||
}
|
||||
string temp = " {0} {1} {2} {3} ";
|
||||
string parameterName = string.Format("{0}Conditional{1}{2}", sqlBuilder.SqlParameterKeyWord, item.FieldName, index);
|
||||
if (parameterName.Contains("."))
|
||||
{
|
||||
parameterName = parameterName.Replace(".", "_");
|
||||
}
|
||||
switch (item.ConditionalType)
|
||||
{
|
||||
case ConditionalType.Equal:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.Like:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, "%" + item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.GreaterThan:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), ">", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.GreaterThanOrEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), ">=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.LessThan:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.LessThanOrEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<=", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, GetFieldValue(item)));
|
||||
break;
|
||||
case ConditionalType.In:
|
||||
if (item.FieldValue == null) item.FieldValue = string.Empty;
|
||||
var inValue1 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")");
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "IN", inValue1);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.NotIn:
|
||||
if (item.FieldValue == null) item.FieldValue = string.Empty;
|
||||
var inValue2 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")");
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "NOT IN", inValue2);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.LikeLeft:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.NoLike:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), " NOT LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue + "%"));
|
||||
break;
|
||||
case ConditionalType.LikeRight:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, "%" + item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.NoEqual:
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.IsNullOrEmpty:
|
||||
builder.AppendFormat("{0} ({1}) OR ({2}) ", type, item.FieldName.ToSqlFilter() + " IS NULL ", item.FieldName.ToSqlFilter() + " = '' ");
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
break;
|
||||
case ConditionalType.IsNot:
|
||||
if (item.FieldValue == null)
|
||||
{
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), " IS NOT ", "NULL");
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName);
|
||||
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var item = model as ConditionalCollections;
|
||||
if (item != null && item.ConditionalList.HasValue())
|
||||
{
|
||||
foreach (var con in item.ConditionalList)
|
||||
{
|
||||
var index = item.ConditionalList.IndexOf(con);
|
||||
var isFirst = index == 0;
|
||||
var isLast = index == (item.ConditionalList.Count - 1);
|
||||
if (models.IndexOf(item) == 0 && index == 0 && beginIndex == 0)
|
||||
{
|
||||
builder.AppendFormat(" ( ");
|
||||
|
||||
}
|
||||
else if (isFirst)
|
||||
{
|
||||
builder.AppendFormat(" {0} ( ", con.Key.ToString().ToUpper());
|
||||
}
|
||||
List<IConditionalModel> conModels = new List<IConditionalModel>();
|
||||
conModels.Add(con.Value);
|
||||
var childSqlInfo = ConditionalModelToSql(conModels, 1000 * (1 + index) + models.IndexOf(item));
|
||||
if (!isFirst)
|
||||
{
|
||||
|
||||
builder.AppendFormat(" {0} ", con.Key.ToString().ToUpper());
|
||||
}
|
||||
builder.Append(childSqlInfo.Key);
|
||||
parameters.AddRange(childSqlInfo.Value);
|
||||
if (isLast)
|
||||
{
|
||||
builder.Append(" ) ");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new KeyValuePair<string, SugarParameter[]>(builder.ToString(), parameters.ToArray());
|
||||
}
|
||||
|
||||
private static object GetFieldValue(ConditionalModel item)
|
||||
{
|
||||
if (item.FieldValueConvertFunc != null)
|
||||
return item.FieldValueConvertFunc(item.FieldValue);
|
||||
else
|
||||
return item.FieldValue;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region
|
||||
public void PageEach<T>(IEnumerable<T> pageItems,int pageSize, Action<List<T>> action)
|
||||
{
|
||||
|
@ -24,7 +24,6 @@ namespace SqlSugar
|
||||
void RemoveCacheAll();
|
||||
void RemoveCacheAll<T>();
|
||||
void RemoveCache<T>(string key);
|
||||
KeyValuePair<string, SugarParameter[]> ConditionalModelToSql(List<IConditionalModel> models,int beginIndex=0);
|
||||
void PageEach<T>(IEnumerable<T> pageItems, int pageSize, Action<List<T>> action);
|
||||
|
||||
}
|
||||
|
@ -40,5 +40,6 @@ namespace SqlSugar
|
||||
string GetUnionAllSql(List<string> sqlList);
|
||||
string GetUnionSql(List<string> sqlList);
|
||||
void RepairReplicationParameters(ref string appendSql, SugarParameter[] parameters, int addIndex);
|
||||
KeyValuePair<string, SugarParameter[]> ConditionalModelToSql(List<IConditionalModel> models, int beginIndex = 0);
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
@ -11,8 +11,7 @@ namespace OrmTest.Demo
|
||||
public static SqlSugarClient GetInstance()
|
||||
{
|
||||
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.Sqlite, IsAutoCloseConnection = true });
|
||||
db.Ado.IsEnableLogEvent = true;
|
||||
db.Ado.LogEventStarting = (sql, pars) =>
|
||||
db.Aop.OnLogExecuting = (sql, pars) =>
|
||||
{
|
||||
Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
|
||||
Console.WriteLine();
|
||||
|
@ -72,8 +72,7 @@ namespace OrmTest.UnitTest
|
||||
public SqlSugarClient GetInstance()
|
||||
{
|
||||
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.Sqlite });
|
||||
db.Ado.IsEnableLogEvent = true;
|
||||
db.Ado.LogEventStarting = (sql, pars) =>
|
||||
db.Aop.OnLogExecuting = (sql, pars) =>
|
||||
{
|
||||
Console.WriteLine(sql + " " + pars);
|
||||
};
|
||||
|
@ -30,7 +30,7 @@ namespace OrmTest.UnitTest
|
||||
using (var db = GetInstance())
|
||||
{
|
||||
//db.Database.IsEnableLogEvent = true;
|
||||
db.Ado.LogEventStarting = (sql, pars) =>
|
||||
db.Aop.OnLogExecuting = (sql, pars) =>
|
||||
{
|
||||
Console.WriteLine(sql + " " + pars);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user