diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Method.cs b/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Method.cs index eb772525e..117824eb2 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Method.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/ExpressionTest/Method.cs @@ -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> 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() + { + new SugarParameter("@Const0",false) + }, "IIF5 error"); + } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 68c24fc3a..55b13e133 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -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() + Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString()); + } + private void AppendModelByIIFMethod(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item) + { + var methodExpression = item as MethodCallExpression; + if (methodExpression.Method.Name.IsIn("ToBool", "ToBoolean","IIF")) { - IsMember = parameter.ChildExpression is MemberExpression, - MemberName = parameter.CommonTempData - }; - if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now") - { - methodCallExpressionArgs.IsMember = false; + model.Args.Add(base.GetMethodCallArgs(parameter, item)); } - var value = methodCallExpressionArgs.MemberName; - if (methodCallExpressionArgs.IsMember) + else { - var childExpression = parameter.ChildExpression as MemberExpression; - if (childExpression.Expression != null && childExpression.Expression is ConstantExpression) - { - methodCallExpressionArgs.IsMember = false; - } + Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString()); } - 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) {