mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-19 01:58:13 +08:00
Optimization analysis
This commit is contained in:
@@ -35,6 +35,7 @@ namespace OrmTest.UnitTest
|
||||
IIF2();
|
||||
IIF3();
|
||||
IIF4();
|
||||
IIF5();
|
||||
#region StringIsNullOrEmpty
|
||||
HasValue();
|
||||
HasNumber();
|
||||
@@ -735,6 +736,19 @@ namespace OrmTest.UnitTest
|
||||
new SugarParameter("@Const0",true)
|
||||
}, "IIF4 error");
|
||||
}
|
||||
|
||||
private void IIF5()
|
||||
{
|
||||
Expression<Func<DataTestInfo, bool>> exp = it => SqlFunc.IIF(true,Convert.ToBoolean(it.Datetime1), SqlFunc.ToBool(it.Datetime1)) == false;
|
||||
SqlServerExpressionContext expContext = new SqlServerExpressionContext();
|
||||
expContext.Resolve(exp, ResolveExpressType.WhereSingle);
|
||||
var value = expContext.Result.GetString();
|
||||
var pars = expContext.Parameters;
|
||||
base.Check(value, pars, "(( CASE WHEN ( 1 = 1 ) THEN CAST([Datetime1] AS BIT) ELSE CAST([Datetime1] AS BIT) END ) = @Const0 )", new List<SugarParameter>()
|
||||
{
|
||||
new SugarParameter("@Const0",false)
|
||||
}, "IIF5 error");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -151,15 +151,16 @@ namespace SqlSugar
|
||||
var isIFFBoolMember = isIIF && (item is MemberExpression) && (item as MemberExpression).Type == PubConst.BoolType;
|
||||
var isIFFUnary = isIIF && (item is UnaryExpression) && (item as UnaryExpression).Operand.Type == PubConst.BoolType;
|
||||
var isIFFBoolBinary = isIIF && (item is BinaryExpression) && (item as BinaryExpression).Type == PubConst.BoolType;
|
||||
var isIFFBoolMethod = isIIF && (item is MethodCallExpression) && (item as MethodCallExpression).Type == PubConst.BoolType;
|
||||
var isFirst = item == args.First();
|
||||
if (isFirst&& isIIF && isConst)
|
||||
if (isFirst && isIIF && isConst)
|
||||
{
|
||||
var value = (item as ConstantExpression).Value.ObjToBool() ? this.Context.DbMehtods.True() : this.Context.DbMehtods.False();
|
||||
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
||||
{
|
||||
IsMember =true,
|
||||
IsMember = true,
|
||||
MemberName = value,
|
||||
MemberValue= value
|
||||
MemberValue = value
|
||||
};
|
||||
model.Args.Add(methodCallExpressionArgs);
|
||||
}
|
||||
@@ -177,6 +178,9 @@ namespace SqlSugar
|
||||
AppendModelByIIFBinary(parameter, model, item);
|
||||
|
||||
}
|
||||
else if (isIFFBoolMethod && !isFirst) {
|
||||
AppendModelByIIFMethod(parameter, model, item);
|
||||
}
|
||||
else if (isBinaryExpression)
|
||||
{
|
||||
model.Args.Add(GetMethodCallArgs(parameter, item));
|
||||
@@ -222,37 +226,19 @@ namespace SqlSugar
|
||||
}
|
||||
private void AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||
{
|
||||
parameter.CommonTempData = CommonTempDataType.Result;
|
||||
base.Expression = item;
|
||||
base.Start();
|
||||
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
||||
{
|
||||
IsMember = parameter.ChildExpression is MemberExpression,
|
||||
MemberName = parameter.CommonTempData
|
||||
};
|
||||
if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now")
|
||||
{
|
||||
methodCallExpressionArgs.IsMember = false;
|
||||
Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
|
||||
}
|
||||
var value = methodCallExpressionArgs.MemberName;
|
||||
if (methodCallExpressionArgs.IsMember)
|
||||
private void AppendModelByIIFMethod(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||
{
|
||||
var childExpression = parameter.ChildExpression as MemberExpression;
|
||||
if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
|
||||
var methodExpression = item as MethodCallExpression;
|
||||
if (methodExpression.Method.Name.IsIn("ToBool", "ToBoolean","IIF"))
|
||||
{
|
||||
methodCallExpressionArgs.IsMember = false;
|
||||
model.Args.Add(base.GetMethodCallArgs(parameter, item));
|
||||
}
|
||||
}
|
||||
if (methodCallExpressionArgs.IsMember == false)
|
||||
else
|
||||
{
|
||||
var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.MethodConst + this.Context.ParameterIndex;
|
||||
this.Context.ParameterIndex++;
|
||||
methodCallExpressionArgs.MemberName = parameterName;
|
||||
methodCallExpressionArgs.MemberValue = value;
|
||||
this.Context.Parameters.Add(new SugarParameter(parameterName, value));
|
||||
Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
|
||||
}
|
||||
model.Args.Add(methodCallExpressionArgs);
|
||||
parameter.ChildExpression = null;
|
||||
}
|
||||
private void AppendModel(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||
{
|
||||
|
Reference in New Issue
Block a user