diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 2dce96f6c..8fbfb8b8f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -34,7 +34,8 @@ namespace SqlSugar public bool IsWhereColumns { get; set; } public bool? IsListUpdate { get; set; } public List UpdateColumns { get; set; } - public List JoinInfos { get; set; } = new List(); + public List JoinInfos { get; set; } + public string ShortName { get; set; } public virtual string SqlTemplate { @@ -260,6 +261,11 @@ namespace SqlSugar { return setValue.First().Value; } + else if (JoinInfos!=null&&JoinInfos.Any()) + { + setValue = SetValues.Where(sv => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Where(sv => sv.Key == Builder.GetNoTranslationColumnName(it.DbColumnName) || sv.Key == Builder.GetNoTranslationColumnName(it.PropertyName)); + return Builder.GetTranslationColumnName(this.ShortName)+"."+ setValue.First().Key+"="+ setValue.First().Value ; + } } var result = Builder.GetTranslationColumnName(it.DbColumnName) + "=" + GetDbColumn(it,this.Context.Ado.SqlParameterKeyWord + it.DbColumnName); return result; @@ -295,8 +301,26 @@ namespace SqlSugar whereString += Builder.GetTranslationColumnName(item) + "=" + this.Context.Ado.SqlParameterKeyWord + item; } } + if (this.JoinInfos != null && this.JoinInfos.Any()) + { + return GetJoinUpdate(columnsString, ref whereString); + } return string.Format(SqlTemplate, GetTableNameString, columnsString, whereString); } + + protected virtual string GetJoinUpdate(string columnsString, ref string whereString) + { + var tableName = Builder.GetTranslationColumnName(this.TableName); + this.TableName = Builder.GetTranslationColumnName(this.ShortName); + var joinString = $" FROM {tableName} {Builder.GetTranslationColumnName(this.ShortName)} "; + foreach (var item in this.JoinInfos) + { + joinString += $"\r\n JOIN {Builder.GetTranslationColumnName(item.TableName)} {Builder.GetTranslationColumnName(item.ShortName)} ON {item.JoinWhere} "; + } + whereString = joinString + "\r\n" + whereString; + return string.Format(SqlTemplate, GetTableNameString, columnsString, whereString); + } + public virtual void ActionMinDate() { if (this.Parameters != null) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 88628468d..b7c45666f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -169,6 +169,7 @@ namespace SqlSugar result.updateableObj = this; var querybale=this.Context.Queryable().LeftJoin(joinExpress); result.updateableObj.UpdateBuilder.JoinInfos = querybale.QueryBuilder.JoinQueryInfos; + result.updateableObj.UpdateBuilder.ShortName = joinExpress.Parameters.FirstOrDefault()?.Name; return result; } public IUpdateable Clone() diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs index 2685ded91..d1e195e64 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs @@ -1,9 +1,12 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq.Expressions; +using System.Reflection; using System.Text; using System.Threading.Tasks; - +using System.Linq; namespace SqlSugar { public class Updateable : IUpdateable where T : class,new() @@ -11,12 +14,12 @@ namespace SqlSugar public IUpdateable updateableObj { get; set; } public int ExecuteCommand() { - throw new NotImplementedException(); + return this.updateableObj.ExecuteCommand(); } public Task ExecuteCommandAsync() { - throw new NotImplementedException(); + return this.updateableObj.ExecuteCommandAsync(); } public IUpdateable InnerJoin(Expression> joinExpress) @@ -26,15 +29,26 @@ namespace SqlSugar public IUpdateable SetColumns(Expression> columns) { - // ((UpdateableProvider)updateableObj).SetColumnsByExpression(columns); + var exp = ((columns as LambdaExpression).Body as MemberInitExpression).Bindings; + var items=ExpressionTool.GetMemberBindingItemList(exp); + var UpdateBuilder = updateableObj.UpdateBuilder; + var SqlBuilder = UpdateBuilder.Builder; + foreach (var item in items) + { + var dbColumnName=updateableObj.UpdateBuilder.Context.EntityMaintenance.GetDbColumnName(item.Key); + var value = updateableObj.UpdateBuilder.GetExpressionValue(item.Value, ResolveExpressType.WhereMultiple).GetString(); + this.updateableObj.UpdateBuilder.SetValues.Add(new KeyValuePair(dbColumnName, value)); + } + UpdateBuilder.DbColumnInfoList = UpdateBuilder.DbColumnInfoList + .Where(it => it.UpdateServerTime == true || it.UpdateSql.HasValue() || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList(); return this; } - - public IUpdateable Where(Expression> whereExpression) { - throw new NotImplementedException(); + var value = updateableObj.UpdateBuilder.GetExpressionValue(whereExpression, ResolveExpressType.WhereMultiple).GetString(); + updateableObj.UpdateBuilder.WhereValues.Add(value); + return this; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 9ca8cded1..442a2c7bc 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -8,6 +9,23 @@ namespace SqlSugar { public class ExpressionTool { + public static Dictionary GetMemberBindingItemList(ReadOnlyCollection exp) + { + Dictionary dict = new Dictionary(); + // 获取MemberInitExpression中的每一个MemberBinding + foreach (var binding in exp) + { + // 判断是MemberAssignment还是MemberListBinding + if (binding is MemberAssignment assignment) + { + // 获取属性名和属性值 + string propertyName = assignment.Member.Name; + dict.Add(assignment.Member.Name, assignment.Expression); + } + + } + return dict; + } public static bool IsVariable(Expression expr) { var ps = new ParameterExpressionVisitor(); diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlUpdateBuilder.cs index 52ba8a269..8c6b6d0f8 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/MySql/SqlBuilder/MySqlUpdateBuilder.cs @@ -26,6 +26,16 @@ namespace SqlSugar "; } } + protected override string GetJoinUpdate(string columnsString, ref string whereString) + { + var joinString = $" {Builder.GetTranslationColumnName(this.TableName)} {Builder.GetTranslationColumnName(this.ShortName)} "; + foreach (var item in this.JoinInfos) + { + joinString += $"\r\n JOIN {Builder.GetTranslationColumnName(item.TableName)} {Builder.GetTranslationColumnName(item.ShortName)} ON {item.JoinWhere} "; + } + var tableName = joinString+ "\r\n "; + return string.Format(SqlTemplate, tableName, columnsString, whereString); + } protected override string TomultipleSqlString(List> groupList) { Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List need Primary key");