diff --git a/OrmTest/ExpressionTest/Method.cs b/OrmTest/ExpressionTest/Method.cs index bc740c9d5..22c270857 100644 --- a/OrmTest/ExpressionTest/Method.cs +++ b/OrmTest/ExpressionTest/Method.cs @@ -23,6 +23,7 @@ namespace OrmTest.ExpressionTest { StringIsNullOrEmpty(); StringIsNullOrEmpty2(); + StringIsNullOrEmpty3(); } base.End("Method Test"); } @@ -45,10 +46,24 @@ namespace OrmTest.ExpressionTest expContext.Resolve(); var value = expContext.Result.GetString(); var pars = expContext.Parameters; - base.Check(value, pars, "(( Id > @Id0 ) OR ( Id='' OR Id IS NULL ))", new List() { + base.Check(value, pars, "(( @Id0 = Id ) OR ( @MethodCost1='' OR @MethodCost1 IS NULL ))", new List() { + new SugarParameter("@MethodCost1",true), new SugarParameter("@Id0",2) }, "StringIsNullOrEmpty2"); } + private void StringIsNullOrEmpty3() + { + int a = 1; + Expression> exp = it => 2 == it.Id || NBORM.IsNullOrEmpty(a); ; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(exp, ResolveExpressType.WhereSingle); + expContext.Resolve(); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "(( @Id0 = Id ) OR ( @MethodCost1='' OR @MethodCost1 IS NULL ))", new List() { + new SugarParameter("@MethodCost1",1), + new SugarParameter("@Id0",2) + }, "StringIsNullOrEmpty3"); + } } } diff --git a/OrmTest/Program.cs b/OrmTest/Program.cs index b537bc967..8c0504d95 100644 --- a/OrmTest/Program.cs +++ b/OrmTest/Program.cs @@ -17,7 +17,7 @@ namespace OrmTest static void Main(string[] args) { //Expression To Sql Unit Test - int eachCount = 1000; + int eachCount = 1; new OrmTest.ExpressionTest.Select(eachCount).Init(); new OrmTest.ExpressionTest.Field(eachCount).Init(); new OrmTest.ExpressionTest.Where(eachCount).Init(); diff --git a/SqlSugar/ExpressionsToSql/Common/ExpressionConst.cs b/SqlSugar/ExpressionsToSql/Common/ExpressionConst.cs index c71138175..b2863b868 100644 --- a/SqlSugar/ExpressionsToSql/Common/ExpressionConst.cs +++ b/SqlSugar/ExpressionsToSql/Common/ExpressionConst.cs @@ -7,7 +7,6 @@ namespace SqlSugar { internal class ExpressionConst { - public const string BinaryExpressionInfoListKey = "BinaryExpressionInfoListKey"; public const string BinaryFormatString = " ( {0} {1} {2} ) "; public const string Format0 = "{0}"; public const string Format1 = "$__$"; @@ -15,6 +14,7 @@ namespace SqlSugar public const string Format3 = "("; public const string Format4 = ")"; public const string NBORMFULLNAME = "SqlSugar.NBORM"; + public const string METHODCOST = "MethodCost"; public readonly static Type MemberExpressionType = typeof(MemberExpression); public readonly static Type ConstantExpressionType = typeof(ConstantExpression); public readonly static Type StringType = typeof(string); diff --git a/SqlSugar/ExpressionsToSql/Common/ExpressionResultAcceptType.cs b/SqlSugar/ExpressionsToSql/Common/ExpressionResultAcceptType.cs index aee7ee4e9..5fe72fdf6 100644 --- a/SqlSugar/ExpressionsToSql/Common/ExpressionResultAcceptType.cs +++ b/SqlSugar/ExpressionsToSql/Common/ExpressionResultAcceptType.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; - namespace SqlSugar { public enum ExpressionResultAppendType diff --git a/SqlSugar/ExpressionsToSql/Common/ResolveExpressType.cs b/SqlSugar/ExpressionsToSql/Common/ResolveExpressType.cs index 55d91f145..b65f2492f 100644 --- a/SqlSugar/ExpressionsToSql/Common/ResolveExpressType.cs +++ b/SqlSugar/ExpressionsToSql/Common/ResolveExpressType.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; - namespace SqlSugar { public enum ResolveExpressType diff --git a/SqlSugar/ExpressionsToSql/Method/DefaultDbMethod.cs b/SqlSugar/ExpressionsToSql/Method/DefaultDbMethod.cs index e89bcb505..ddcd32aec 100644 --- a/SqlSugar/ExpressionsToSql/Method/DefaultDbMethod.cs +++ b/SqlSugar/ExpressionsToSql/Method/DefaultDbMethod.cs @@ -5,20 +5,12 @@ using System.Text; using System.Threading.Tasks; namespace SqlSugar { - public partial class DefaultDbMethod : IDbMethods + public abstract partial class DefaultDbMethod : IDbMethods { public virtual string IsNullOrEmpty(MethodCallExpressionModel model) { var parameter = model.Args[0]; - if (parameter.IsMember) - { - return string.Format("( {0}='' OR {0} IS NULL )", parameter.Value); - } - else - { - return null; - } - + return string.Format("( {0}='' OR {0} IS NULL )", parameter.Value); } } } diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs index 9078e437a..78fa2b88e 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs @@ -14,6 +14,8 @@ namespace SqlSugar var expression = base.Expression as MemberExpression; var isLeft = parameter.IsLeft; object value = ExpressionTool.GetMemberValue(expression.Member, expression); + var baseParameter = parameter.BaseParameter; + var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.ChildNodeSet); switch (parameter.Context.ResolveType) { case ResolveExpressType.SelectSingle: @@ -21,10 +23,15 @@ namespace SqlSugar parameter.BaseParameter.CommonTempData = value; break; case ResolveExpressType.WhereSingle: - AppendParameter(parameter, isLeft, value); - break; case ResolveExpressType.WhereMultiple: - AppendParameter(parameter, isLeft, value); + if (isSetTempData) + { + baseParameter.CommonTempData = value; + } + else + { + AppendParameter(parameter, isLeft, value); + } break; case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldMultiple: diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index c03b24f8c..bf01e25b0 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -25,13 +25,30 @@ namespace SqlSugar { base.Expression = item; base.Start(); - model.Args.Add(new MethodCallExpressionArgs() + var methodCallExpressionArgs = new MethodCallExpressionArgs() { IsMember = parameter.ChildExpression is MemberExpression, Value = parameter.CommonTempData - }); + }; + var value = methodCallExpressionArgs.Value; + if (methodCallExpressionArgs.IsMember) + { + var childExpression = parameter.ChildExpression as MemberExpression; + if (childExpression.Expression != null && childExpression.Expression is ConstantExpression) + { + methodCallExpressionArgs.IsMember = false; + } + } + if (methodCallExpressionArgs.IsMember == false) + { + var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.METHODCOST + this.Context.ParameterIndex; + this.Context.ParameterIndex++; + methodCallExpressionArgs.Value = parameterName; + this.Context.Parameters.Add(new SugarParameter(parameterName, value)); + } + model.Args.Add(methodCallExpressionArgs); } - var methodValue = GetMdthodValue(name,model); + var methodValue = GetMdthodValue(name, model); base.Context.Result.Append(methodValue); break; case ResolveExpressType.SelectSingle: @@ -39,7 +56,6 @@ namespace SqlSugar case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldMultiple: default: - break; } } @@ -49,7 +65,7 @@ namespace SqlSugar switch (name) { case "IsNullOrEmpty": - return this.Context.DbMehtods.IsNullOrEmpty(model); + return this.Context.DbMehtods.IsNullOrEmpty(model); default: break; }