diff --git a/.vs/SqlSugar/v14/.suo b/.vs/SqlSugar/v14/.suo index d0c49d3b5..a80e8902a 100644 Binary files a/.vs/SqlSugar/v14/.suo and b/.vs/SqlSugar/v14/.suo differ diff --git a/OrmTest/ExpressionTest/Select.cs b/OrmTest/ExpressionTest/Select.cs index a1d05188d..eebf8cac2 100644 --- a/OrmTest/ExpressionTest/Select.cs +++ b/OrmTest/ExpressionTest/Select.cs @@ -13,10 +13,11 @@ namespace OrmTest.ExpressionTest { internal static void Init() { - Expression> exp = it => new Program() { x = it.Name }; + Expression> exp = it => new Program() { x = "a" }; ExpressionContext expContext = new ExpressionContext(exp, ResolveExpressType.WhereSingle); expContext.ResolveType = ResolveExpressType.SelectSingle; - var x = expContext.Result; + expContext.Resolve(); + var x = expContext.Result.GetString(); } } } diff --git a/OrmTest/bin/Debug/OrmTest.exe b/OrmTest/bin/Debug/OrmTest.exe index c47308d6b..c06f30065 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 9e8103e24..0bccbad84 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 cfa427830..a4199c906 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 96462cd01..80fab8729 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 3d852afcd..7061a5615 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 c47308d6b..c06f30065 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 9e8103e24..0bccbad84 100644 Binary files a/OrmTest/obj/Debug/OrmTest.pdb and b/OrmTest/obj/Debug/OrmTest.pdb differ diff --git a/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs b/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs index 72b27614c..552ca47b8 100644 --- a/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs +++ b/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs @@ -40,7 +40,7 @@ namespace SqlSugar public string GetString() { if (_Result == null) return null; - return _Result.ToString(); + return _Result.ToString().TrimEnd(','); } #region functions public string[] GetResultArray() @@ -64,6 +64,7 @@ namespace SqlSugar case ResolveExpressType.WhereMultiple: break; case ResolveExpressType.SelectSingle: + parameter=parameter + ","; break; case ResolveExpressType.SelectMultiple: break; diff --git a/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index ae44f5e3f..0a13ad532 100644 --- a/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -47,7 +47,7 @@ namespace SqlSugar } } - public static object GetValue(MemberInfo member, Expression expression) + public static object GetMemberValue(MemberInfo member, Expression expression) { var memberInfos = new Stack(); var fieldInfo = member as System.Reflection.FieldInfo; @@ -168,5 +168,14 @@ namespace SqlSugar return value; } + + public static Type GetPropertyOrFieldType(MemberInfo propertyOrField) + { + if (propertyOrField.MemberType == MemberTypes.Property) + return ((PropertyInfo)propertyOrField).PropertyType; + if (propertyOrField.MemberType == MemberTypes.Field) + return ((FieldInfo)propertyOrField).FieldType; + throw new NotSupportedException(); + } } } diff --git a/SqlSugar/ExpressionsToSql/ExpressionContext.cs b/SqlSugar/ExpressionsToSql/ExpressionContext.cs index 7e6a861e6..28bc12286 100644 --- a/SqlSugar/ExpressionsToSql/ExpressionContext.cs +++ b/SqlSugar/ExpressionsToSql/ExpressionContext.cs @@ -45,6 +45,8 @@ namespace SqlSugar { get { + if (base._Parameters == null) + base._Parameters = new List(); return base._Parameters; } set @@ -66,6 +68,11 @@ namespace SqlSugar { return name; } + public virtual void Resolve() + { + BaseResolve resolve = new BaseResolve(new ExpressionParameter() { Expression = this.Expression, Context = this }); + resolve.Start(); + } #endregion } } diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs index 273a51331..c2ac3f9dc 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MemberConstExpressionResolve.cs @@ -13,7 +13,7 @@ namespace SqlSugar { var expression = base.Expression as MemberExpression; var isLeft = parameter.IsLeft; - object value = ExpressionTool.GetValue(expression.Member, expression); + object value = ExpressionTool.GetMemberValue(expression.Member, expression); if (parameter.BaseParameter.BinaryExpressionInfoList != null) { parameter.BaseParameter.BinaryExpressionInfoList.Add(new KeyValuePair(ExpressionConst.BinaryExpressionInfoListKey, new BinaryExpressionInfo() diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index 62c66414e..321c523a7 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Text; using System.Threading.Tasks; namespace SqlSugar @@ -18,6 +19,7 @@ namespace SqlSugar case ResolveExpressType.WhereMultiple: break; case ResolveExpressType.SelectSingle: + SelectSingle(expression, parameter); break; case ResolveExpressType.SelectMultiple: break; @@ -29,5 +31,45 @@ namespace SqlSugar break; } } + + private void SelectSingle(MemberInitExpression expression, ExpressionParameter parameter) + { + int i = 0; + foreach (MemberBinding binding in expression.Bindings) + { + ++i; + if (binding.BindingType != MemberBindingType.Assignment) + { + throw new NotSupportedException(); + } + MemberAssignment memberAssignment = (MemberAssignment)binding; + MemberInfo member = memberAssignment.Member; + Type memberType = ExpressionTool.GetPropertyOrFieldType(member); + var name = memberType.Name; + var isValueType = memberType.IsValueType || memberType == ExpressionConst.StringType; + if (isValueType) + { + if (memberAssignment.Expression.NodeType==ExpressionType.Constant) + { + var value= ((ConstantExpression)memberAssignment.Expression).Value; + string parameterName = this.Context.SqlParameterKeyWord + "constant" + i; + parameter.Context.Result.Append(parameterName); + this.Context.Parameters.Add(new SugarParameter(parameterName, value)); + } + else + { + var memberExpression = (MemberExpression)memberAssignment.Expression; + var fieldNme = (memberExpression).Member.Name; + parameter.Context.Result.Append(fieldNme); + } + } + else + { + + + } + } + } + } } diff --git a/SqlSugar/bin/Debug/SqlSugar.dll b/SqlSugar/bin/Debug/SqlSugar.dll index cfa427830..a4199c906 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 96462cd01..80fab8729 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 cfa427830..a4199c906 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 96462cd01..80fab8729 100644 Binary files a/SqlSugar/obj/Debug/SqlSugar.pdb and b/SqlSugar/obj/Debug/SqlSugar.pdb differ