From 75f4eb92e2dee6ffa383ff43c05af02232dd81fa Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sat, 9 Sep 2023 22:03:13 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20UpdateJoin=20=E4=B8=8E?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E8=BF=87=E6=BB=A4=E5=99=A8=E5=88=AB=E5=90=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B#1612?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 2 + FreeSql/FreeSql.xml | 98 +++++++++++++++++++ .../CommonProvider/UpdateJoinProvider.cs | 6 ++ .../Internal/CommonProvider/UpdateProvider.cs | 32 +++++- 4 files changed, 133 insertions(+), 5 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index d3d36ca9..26983509 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -600,6 +600,8 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.GlobalFilter.Apply("test01", a => a.IsDeleted == false); + var updatejoin031sql = fsql.Update() .Join((a, b) => a.GroupId == b.Id) .Set((a, b) => b.GroupName == a.Username + "b.groupname") diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 9e33336b..368317df 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1084,6 +1084,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5748,6 +5824,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs index 8bec0b70..b8c5360f 100644 --- a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs @@ -279,6 +279,7 @@ namespace FreeSql.Internal.CommonProvider public string ToSql() { _updateProvider._interceptSql = InterceptSql; + _updateProvider._tableAlias = _query2Provider._tables[0].Alias; try { return _update.ToSql(); @@ -286,11 +287,13 @@ namespace FreeSql.Internal.CommonProvider finally { _updateProvider._interceptSql = null; + _updateProvider._tableAlias = null; } } public int ExecuteAffrows() { _updateProvider._interceptSql = InterceptSql; + _updateProvider._tableAlias = _query2Provider._tables[0].Alias; try { return _update.ExecuteAffrows(); @@ -298,6 +301,7 @@ namespace FreeSql.Internal.CommonProvider finally { _updateProvider._interceptSql = null; + _updateProvider._tableAlias = null; } } #if net40 @@ -305,6 +309,7 @@ namespace FreeSql.Internal.CommonProvider async public Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) { _updateProvider._interceptSql = InterceptSql; + _updateProvider._tableAlias = _query2Provider._tables[0].Alias; try { return await _update.ExecuteAffrowsAsync(cancellationToken); @@ -312,6 +317,7 @@ namespace FreeSql.Internal.CommonProvider finally { _updateProvider._interceptSql = null; + _updateProvider._tableAlias = null; } } #endif diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index ec46e67f..27059ad1 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -37,6 +37,7 @@ namespace FreeSql.Internal.CommonProvider public DbConnection _connection; public int _commandTimeout = 0; public Action _interceptSql; + public string _tableAlias; public object _updateVersionValue; public bool _isAutoSyncStructure; @@ -214,6 +215,7 @@ namespace FreeSql.Internal.CommonProvider _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); _batchProgress = null; _interceptSql = null; + _tableAlias = null; _versionColumn = _table?.VersionColumn; _ignoreVersion = false; } @@ -1234,21 +1236,41 @@ namespace FreeSql.Internal.CommonProvider public virtual void ToSqlWhere(StringBuilder sb) { + var andTimes = 0; sb.Append(" \r\nWHERE "); if (_source.Any()) { if (_tempPrimarys.Any() == false) throw new ArgumentException(CoreStrings.NoPrimaryKey_UseSetDto(_table.Type.DisplayCsharp())); sb.Append('(').Append(_commonUtils.WhereItems(_tempPrimarys, "", _source)).Append(')'); + andTimes++; } - if (_where.Length > 0) - sb.Append(_source.Any() ? _where.ToString() : _where.ToString().Substring(5)); - if (_whereGlobalFilter.Any()) { - var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter, false); + var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table, Alias = _tableAlias }, _whereGlobalFilter.Where(a => a.Before == true), false); if (string.IsNullOrEmpty(globalFilterCondi) == false) - sb.Append(" AND ").Append(globalFilterCondi); + { + if (andTimes > 0) sb.Append(" AND "); + sb.Append(globalFilterCondi); + andTimes++; + } + } + + if (_where.Length > 0) + { + sb.Append(andTimes > 0 ? _where.ToString() : _where.ToString().Substring(5)); + andTimes++; + } + + if (_whereGlobalFilter.Any()) + { + var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table, Alias = _tableAlias }, _whereGlobalFilter.Where(a => a.Before == false), false); + if (string.IsNullOrEmpty(globalFilterCondi) == false) + { + if (andTimes > 0) sb.Append(" AND "); + sb.Append(globalFilterCondi); + andTimes++; + } } if (_versionColumn != null)