diff --git a/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs b/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs index 6455f6082..fe56776f6 100644 --- a/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs +++ b/Src/Asp.Net/SqlServerTest/Demos/2_Update.cs @@ -64,7 +64,13 @@ namespace OrmTest.Demo t12.Wait(); //update one columns - var count= db.Updateable().UpdateColumns(it => it.SchoolId == 1).Where(it => it.Id == 1).ExecuteCommand(); + var count = db.Updateable().UpdateColumns(it => it.SchoolId == 1).Where(it => it.Id == 1).ExecuteCommand(); + + + var t13 = db.Updateable().UpdateColumns(it => new Student() { + SchoolId = SqlFunc.Subqueryable().Where(s=>s.Id==it.SchoolId).Select(s=>s.Id), + Name="newname" + }).Where(it => it.Id == 1).ExecuteCommand(); } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index 435ffb2e4..b4b347b05 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -48,7 +48,7 @@ namespace SqlSugar } MemberAssignment memberAssignment = (MemberAssignment)binding; var type = memberAssignment.Member.ReflectedType; - var memberName =this.Context.GetDbColumnName(type.Name, memberAssignment.Member.Name); + var memberName = this.Context.GetDbColumnName(type.Name, memberAssignment.Member.Name); var item = memberAssignment.Expression; if ((item is MemberExpression) && ((MemberExpression)item).Expression == null) { @@ -56,21 +56,20 @@ namespace SqlSugar string parameterName = AppendParameter(paramterValue); this.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); } - else if (item is UnaryExpression || item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant) + else if (IsMethod(item)) + { + item = (item as UnaryExpression).Operand; + MethodCall(parameter, memberName, item); + } + else if (IsConst(item)) { base.Expression = item; base.Start(); - string parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const+ this.Context.ParameterIndex; + string parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex; parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); this.Context.ParameterIndex++; } - else if (item is MethodCallExpression) - { - base.Expression = item; - base.Start(); - parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString())); - } else if (item is MemberExpression) { if (base.Context.Result.IsLockCurrentParameter == false) @@ -87,12 +86,29 @@ namespace SqlSugar } else if (item is BinaryExpression) { - var result=GetNewExpressionValue(item); + var result = GetNewExpressionValue(item); this.Context.Result.Append(base.Context.GetEqString(memberName, result)); } } } + private static bool IsConst(Expression item) + { + return item is UnaryExpression || item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant; + } + + private static bool IsMethod(Expression item) + { + return item is MethodCallExpression || (item is UnaryExpression && (item as UnaryExpression).Operand is MethodCallExpression); + } + + private void MethodCall(ExpressionParameter parameter, string memberName, Expression item) + { + base.Expression = item; + base.Start(); + parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString())); + } + private void Select(MemberInitExpression expression, ExpressionParameter parameter, bool isSingle) { foreach (MemberBinding binding in expression.Bindings) @@ -107,5 +123,10 @@ namespace SqlSugar ResolveNewExpressions(parameter, item, memberName); } } + + private bool IsSubMethod(MethodCallExpression express, string methodName) + { + return SubTools.SubItemsConst.Any(it => it.Name == methodName) && express.Object != null && express.Object.Type.Name == "Subqueryable`1"; + } } }