mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-18 17:48:11 +08:00
Optimization analysis
This commit is contained in:
@@ -35,6 +35,7 @@ namespace OrmTest.UnitTest
|
|||||||
IIF2();
|
IIF2();
|
||||||
IIF3();
|
IIF3();
|
||||||
IIF4();
|
IIF4();
|
||||||
|
IIF5();
|
||||||
#region StringIsNullOrEmpty
|
#region StringIsNullOrEmpty
|
||||||
HasValue();
|
HasValue();
|
||||||
HasNumber();
|
HasNumber();
|
||||||
@@ -735,6 +736,19 @@ namespace OrmTest.UnitTest
|
|||||||
new SugarParameter("@Const0",true)
|
new SugarParameter("@Const0",true)
|
||||||
}, "IIF4 error");
|
}, "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 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 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 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();
|
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 value = (item as ConstantExpression).Value.ObjToBool() ? this.Context.DbMehtods.True() : this.Context.DbMehtods.False();
|
||||||
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
||||||
{
|
{
|
||||||
IsMember =true,
|
IsMember = true,
|
||||||
MemberName = value,
|
MemberName = value,
|
||||||
MemberValue= value
|
MemberValue = value
|
||||||
};
|
};
|
||||||
model.Args.Add(methodCallExpressionArgs);
|
model.Args.Add(methodCallExpressionArgs);
|
||||||
}
|
}
|
||||||
@@ -177,6 +178,9 @@ namespace SqlSugar
|
|||||||
AppendModelByIIFBinary(parameter, model, item);
|
AppendModelByIIFBinary(parameter, model, item);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (isIFFBoolMethod && !isFirst) {
|
||||||
|
AppendModelByIIFMethod(parameter, model, item);
|
||||||
|
}
|
||||||
else if (isBinaryExpression)
|
else if (isBinaryExpression)
|
||||||
{
|
{
|
||||||
model.Args.Add(GetMethodCallArgs(parameter, item));
|
model.Args.Add(GetMethodCallArgs(parameter, item));
|
||||||
@@ -222,37 +226,19 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
private void AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
private void AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||||
{
|
{
|
||||||
parameter.CommonTempData = CommonTempDataType.Result;
|
Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
|
||||||
base.Expression = item;
|
}
|
||||||
base.Start();
|
private void AppendModelByIIFMethod(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||||
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
{
|
||||||
|
var methodExpression = item as MethodCallExpression;
|
||||||
|
if (methodExpression.Method.Name.IsIn("ToBool", "ToBoolean","IIF"))
|
||||||
{
|
{
|
||||||
IsMember = parameter.ChildExpression is MemberExpression,
|
model.Args.Add(base.GetMethodCallArgs(parameter, item));
|
||||||
MemberName = parameter.CommonTempData
|
|
||||||
};
|
|
||||||
if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now")
|
|
||||||
{
|
|
||||||
methodCallExpressionArgs.IsMember = false;
|
|
||||||
}
|
}
|
||||||
var value = methodCallExpressionArgs.MemberName;
|
else
|
||||||
if (methodCallExpressionArgs.IsMember)
|
|
||||||
{
|
{
|
||||||
var childExpression = parameter.ChildExpression as MemberExpression;
|
Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
|
||||||
if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
|
|
||||||
{
|
|
||||||
methodCallExpressionArgs.IsMember = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (methodCallExpressionArgs.IsMember == false)
|
|
||||||
{
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
model.Args.Add(methodCallExpressionArgs);
|
|
||||||
parameter.ChildExpression = null;
|
|
||||||
}
|
}
|
||||||
private void AppendModel(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
private void AppendModel(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user