diff --git a/.vs/SqlSugar/v14/.suo b/.vs/SqlSugar/v14/.suo index d37eeaad0..5e05f155b 100644 Binary files a/.vs/SqlSugar/v14/.suo and b/.vs/SqlSugar/v14/.suo differ diff --git a/OrmTest/Program.cs b/OrmTest/Program.cs index eaeb530d8..cf3bd8ee9 100644 --- a/OrmTest/Program.cs +++ b/OrmTest/Program.cs @@ -14,10 +14,12 @@ namespace OrmTest class Program { + public string id { get; set;} static void Main(string[] args) { - string id = "1"; - Expression> exp = it => it.Name!=id; + + string x = "1"; + Expression> exp = it => it.Name!=x; // Expression> exp = it => it.Name; ExpressionContext expContext = new ExpressionContext(exp, ResolveExpressType.Single); // var x = expContext.GetFiledName(); diff --git a/OrmTest/bin/Debug/OrmTest.exe b/OrmTest/bin/Debug/OrmTest.exe index ce27bc4d0..394b2780c 100644 Binary files a/OrmTest/bin/Debug/OrmTest.exe and b/OrmTest/bin/Debug/OrmTest.exe differ diff --git a/OrmTest/bin/Debug/OrmTest.pdb b/OrmTest/bin/Debug/OrmTest.pdb index fe9cc1c12..566122e32 100644 Binary files a/OrmTest/bin/Debug/OrmTest.pdb and b/OrmTest/bin/Debug/OrmTest.pdb differ diff --git a/OrmTest/bin/Debug/SqlSugar.dll b/OrmTest/bin/Debug/SqlSugar.dll index 78def50d8..628b82eab 100644 Binary files a/OrmTest/bin/Debug/SqlSugar.dll and b/OrmTest/bin/Debug/SqlSugar.dll differ diff --git a/OrmTest/bin/Debug/SqlSugar.pdb b/OrmTest/bin/Debug/SqlSugar.pdb index 38c21ea65..d8ef9cf64 100644 Binary files a/OrmTest/bin/Debug/SqlSugar.pdb and b/OrmTest/bin/Debug/SqlSugar.pdb differ diff --git a/OrmTest/obj/Debug/OrmTest.csprojResolveAssemblyReference.cache b/OrmTest/obj/Debug/OrmTest.csprojResolveAssemblyReference.cache index 250540d21..1d1632677 100644 Binary files a/OrmTest/obj/Debug/OrmTest.csprojResolveAssemblyReference.cache and b/OrmTest/obj/Debug/OrmTest.csprojResolveAssemblyReference.cache differ diff --git a/OrmTest/obj/Debug/OrmTest.exe b/OrmTest/obj/Debug/OrmTest.exe index ce27bc4d0..394b2780c 100644 Binary files a/OrmTest/obj/Debug/OrmTest.exe and b/OrmTest/obj/Debug/OrmTest.exe differ diff --git a/OrmTest/obj/Debug/OrmTest.pdb b/OrmTest/obj/Debug/OrmTest.pdb index fe9cc1c12..566122e32 100644 Binary files a/OrmTest/obj/Debug/OrmTest.pdb and b/OrmTest/obj/Debug/OrmTest.pdb differ diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 295d62bb5..85aa5d25e 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -61,8 +61,11 @@ namespace SqlSugar } else if (exp is MemberExpression&&((MemberExpression)exp).Expression.NodeType== ExpressionType.Constant) { - parameter.Expression = ((MemberExpression)exp).Expression; - return new ConstantExpressionResolve(parameter); + return new MemberConstExpressionResolve(parameter); + } + else if (exp is MemberExpression && ((MemberExpression)exp).Expression.NodeType == ExpressionType.New) + { + return new MemberNewExpressionResolve(parameter); } else if (exp is ConstantExpression) { diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs index 306cf6701..fbb324c0d 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs @@ -29,105 +29,5 @@ namespace SqlSugar base.Context.SqlWhere.Append(value); } } - - //private object GetValue(MemberInfo member, Expression expression) - //{ - // var memberInfos = new Stack(); - // var fieldInfo = member as System.Reflection.FieldInfo; - // object dynInv = null; - // // "descend" toward's the root object reference: - // while (expression is MemberExpression) - // { - // var memberExpr = expression as MemberExpression; - // memberInfos.Push(memberExpr.Member); - // if (memberExpr.Expression == null) - // { - // if (memberExpr.Member.MemberType == MemberTypes.Property) - // { - // PropertyInfo pro = (PropertyInfo)memberExpr.Member; - // dynInv = pro.GetValue(memberExpr.Member, null); - // if (dynInv != null && dynInv.GetType().IsClass) - // { - // var fieldName = memberExpr.Member.Name; - // var proInfo = dynInv.GetType().GetProperty(fieldName); - // if (proInfo != null) - // { - // dynInv = proInfo.GetValue(dynInv, null); - // } - // var fieInfo = dynInv.GetType().GetField(fieldName); - // if (fieInfo != null) - // { - // dynInv = fieInfo.GetValue(dynInv); - // } - // if (fieInfo == null && proInfo == null) - // { - - // } - // } - // } - // else if (memberExpr.Member.MemberType == MemberTypes.Field) - // { - // FieldInfo field = (FieldInfo)memberExpr.Member; - // dynInv = field.GetValue(memberExpr.Member); - // if (dynInv != null && dynInv.GetType().IsClass && dynInv.GetType() != ExpressionConst.StringType) - // { - // var fieldName = memberExpr.Member.Name; - // var proInfo = dynInv.GetType().GetProperty(fieldName); - // if (proInfo != null) - // { - // dynInv = proInfo.GetValue(dynInv, null); - // } - // var fieInfo = dynInv.GetType().GetField(fieldName); - // if (fieInfo != null) - // { - // dynInv = fieInfo.GetValue(dynInv); - // } - // if (fieInfo == null && proInfo == null) - // { - - // } - // } - // } - // } - // if (memberExpr.Expression == null) - // { - - // } - // expression = memberExpr.Expression; - // } - - // // fetch the root object reference: - // var constExpr = expression as ConstantExpression; - // if (constExpr == null) - // { - - // } - // var objReference = constExpr.Value; - - // // "ascend" back whence we came from and resolve object references along the way: - // while (memberInfos.Count > 0) // or some other break condition - // { - // var mi = memberInfos.Pop(); - // if (mi.MemberType == MemberTypes.Property) - // { - // var objProp = objReference.GetType().GetProperty(mi.Name); - // if (objProp == null) - // { - - // } - // objReference = objProp.GetValue(objReference, null); - // } - // else if (mi.MemberType == MemberTypes.Field) - // { - // var objField = objReference.GetType().GetField(mi.Name); - // if (objField == null) - // { - - // } - // objReference = objField.GetValue(objReference); - // } - // } - // return dynInv; - //} } } diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs new file mode 100644 index 000000000..19b02c88c --- /dev/null +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class MemberConstExpressionResolve : BaseResolve + { + public MemberConstExpressionResolve(ExpressionParameter parameter) : base(parameter) + { + var expression = base.Expression as MemberExpression; + var isLeft = parameter.IsLeft; + var isSingle = parameter.Context.IsSingle; + object value = GetValue(expression.Member, expression); + if (parameter.BaseParameter.BinaryExpressionInfoList != null) + { + parameter.BaseParameter.BinaryExpressionInfoList.Add(new KeyValuePair(ExpressionConst.BinaryExpressionInfoListKey, new BinaryExpressionInfo() + { + IsLeft = Convert.ToBoolean(isLeft), + Value = value, + ExpressionType = expression.Expression.GetType() + })); + } + if (isLeft == null && base.Context.SqlWhere == null) + { + base.Context.SqlWhere = new StringBuilder(); + base.Context.SqlWhere.Append(value); + } + } + private object GetValue(MemberInfo member, Expression expression) + { + var memberInfos = new Stack(); + var fieldInfo = member as System.Reflection.FieldInfo; + object reval = null; + // "descend" toward's the root object reference: + while (expression is MemberExpression) + { + var memberExpr = expression as MemberExpression; + memberInfos.Push(memberExpr.Member); + if (memberExpr.Expression == null) + { + var isProperty = memberExpr.Member.MemberType == MemberTypes.Property; + var isField = memberExpr.Member.MemberType == MemberTypes.Field; + if (isProperty) + { + reval = GetPropertyValue(memberExpr); + } + else if (isField) + { + reval = GetFiledValue(memberExpr); + } + } + if (memberExpr.Expression == null) + { + + } + expression = memberExpr.Expression; + } + // fetch the root object reference: + var constExpr = expression as ConstantExpression; + if (constExpr == null) + { + + } + var objReference = constExpr.Value; + + // "ascend" back whence we came from and resolve object references along the way: + while (memberInfos.Count > 0) // or some other break condition + { + var mi = memberInfos.Pop(); + if (mi.MemberType == MemberTypes.Property) + { + var objProp = objReference.GetType().GetProperty(mi.Name); + if (objProp == null) + { + + } + objReference = objProp.GetValue(objReference, null); + } + else if (mi.MemberType == MemberTypes.Field) + { + var objField = objReference.GetType().GetField(mi.Name); + if (objField == null) + { + + } + objReference = objField.GetValue(objReference); + } + } + reval = objReference; + return reval; + } + + private static object GetFiledValue(MemberExpression memberExpr) + { + object reval; + { + FieldInfo field = (FieldInfo)memberExpr.Member; + reval = field.GetValue(memberExpr.Member); + if (reval != null && reval.GetType().IsClass && reval.GetType() != ExpressionConst.StringType) + { + var fieldName = memberExpr.Member.Name; + var proInfo = reval.GetType().GetProperty(fieldName); + if (proInfo != null) + { + reval = proInfo.GetValue(reval, null); + } + var fieInfo = reval.GetType().GetField(fieldName); + if (fieInfo != null) + { + reval = fieInfo.GetValue(reval); + } + if (fieInfo == null && proInfo == null) + { + + } + } + } + return reval; + } + + private static object GetPropertyValue(MemberExpression memberExpr) + { + object reval; + PropertyInfo pro = (PropertyInfo)memberExpr.Member; + reval = pro.GetValue(memberExpr.Member, null); + if (reval != null && reval.GetType().IsClass && reval.GetType() != ExpressionConst.StringType) + { + var fieldName = memberExpr.Member.Name; + var proInfo = reval.GetType().GetProperty(fieldName); + if (proInfo != null) + { + reval = proInfo.GetValue(reval, null); + } + var fieInfo = reval.GetType().GetField(fieldName); + if (fieInfo != null) + { + reval = fieInfo.GetValue(reval); + } + if (fieInfo == null && proInfo == null) + { + + } + } + return reval; + } + } +} diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MemberNewExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MemberNewExpressionResolve.cs new file mode 100644 index 000000000..3c1bda506 --- /dev/null +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MemberNewExpressionResolve.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class MemberNewExpressionResolve : BaseResolve + { + public MemberNewExpressionResolve(ExpressionParameter parameter) : base(parameter) { + + } + + } +} diff --git a/SqlSugar/SqlSugar.csproj b/SqlSugar/SqlSugar.csproj index 7f491bb84..bf58370c2 100644 --- a/SqlSugar/SqlSugar.csproj +++ b/SqlSugar/SqlSugar.csproj @@ -99,6 +99,8 @@ + + diff --git a/SqlSugar/bin/Debug/SqlSugar.dll b/SqlSugar/bin/Debug/SqlSugar.dll index 78def50d8..628b82eab 100644 Binary files a/SqlSugar/bin/Debug/SqlSugar.dll and b/SqlSugar/bin/Debug/SqlSugar.dll differ diff --git a/SqlSugar/bin/Debug/SqlSugar.pdb b/SqlSugar/bin/Debug/SqlSugar.pdb index 38c21ea65..d8ef9cf64 100644 Binary files a/SqlSugar/bin/Debug/SqlSugar.pdb and b/SqlSugar/bin/Debug/SqlSugar.pdb differ diff --git a/SqlSugar/obj/Debug/SqlSugar.dll b/SqlSugar/obj/Debug/SqlSugar.dll index 78def50d8..628b82eab 100644 Binary files a/SqlSugar/obj/Debug/SqlSugar.dll and b/SqlSugar/obj/Debug/SqlSugar.dll differ diff --git a/SqlSugar/obj/Debug/SqlSugar.pdb b/SqlSugar/obj/Debug/SqlSugar.pdb index 38c21ea65..d8ef9cf64 100644 Binary files a/SqlSugar/obj/Debug/SqlSugar.pdb and b/SqlSugar/obj/Debug/SqlSugar.pdb differ