Optimization analysis

This commit is contained in:
sunkaixuan
2017-08-14 00:39:25 +08:00
parent 2a7b832462
commit 9dac12aba4
2 changed files with 30 additions and 30 deletions

View File

@@ -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");
}
} }
} }

View File

@@ -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)
{ {