diff --git a/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs b/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs index 6741a984a..0be9b6e97 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs @@ -26,11 +26,12 @@ namespace OrmTest }; db.CodeFirst.SplitTables().InitTables(); var list=db.Queryable().SplitTable(tabs => tabs.Take(3)).ToList(); - + + var x = db.Deleteable().Where(it=>it.Pk==Guid.NewGuid()).SplitTable(tabs => tabs.Take(3)).ExecuteCommand(); Console.WriteLine("#### CodeFirst end ####"); } - [SqlSugar.SugarTable("Taxxx0101{year}{month}{day}")] + [SqlSugar.SugarTable("Taxxx0101_{year}{month}{day}")] public class OrderSpliteTest { [SugarColumn(IsPrimaryKey =true)] diff --git a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs index a455f4d2b..ecb2286ba 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs @@ -11,14 +11,14 @@ namespace SqlSugar public SqlSugarProvider Context; public void InitTables() { - var oldMapping = this.Context.Utilities.TranslateCopy(this.Context.MappingTables); + //var oldMapping = this.Context.Utilities.TranslateCopy(this.Context.MappingTables); SplitTableHelper helper = new SplitTableHelper() { Context = this.Context, EntityInfo = this.Context.EntityMaintenance.GetEntityInfo() }; var tables = helper.GetTables(); - var oldMapingTables = this.Context.MappingTables; + //var oldMapingTables = this.Context.MappingTables; if (tables.Count >0) { foreach (var item in tables) @@ -32,7 +32,7 @@ namespace SqlSugar this.Context.MappingTables.Add(helper.EntityInfo.EntityName, helper.GetDefaultTableName()); this.Context.CodeFirst.InitTables(typeof(T)); } - this.Context.MappingTables = oldMapingTables; + this.Context.MappingTables.Add(helper.EntityInfo.EntityName, helper.EntityInfo.DbTableName); } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index b2d8ef8e9..193ff98c3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -258,6 +258,21 @@ namespace SqlSugar this.Where(Regex.Split(sqlable.Key," Where ",RegexOptions.IgnoreCase).Last(), sqlable.Value); return this; } + public SplitTableDeleteProvider SplitTable(Func, IEnumerable> getTableNamesFunc) + { + this.Context.MappingTables.Add(this.EntityInfo.EntityName, this.EntityInfo.DbTableName); + SplitTableDeleteProvider result = new SplitTableDeleteProvider(); + result.Context = this.Context; + SplitTableHelper helper = new SplitTableHelper() + { + Context =(SqlSugarProvider)Context, + EntityInfo = this.EntityInfo + }; + var tables = getTableNamesFunc(helper.GetTables()); + result.Tables = tables; + result.deleteobj = this; + return result; + } public IDeleteable RemoveDataCache(string likeString) { this.RemoveCacheFunc = () => diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/SplitTableDeleteProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/SplitTableDeleteProvider.cs new file mode 100644 index 000000000..5f2735ecb --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/SplitTableDeleteProvider.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SplitTableDeleteProvider where T : class, new() + { + public ISqlSugarClient Context; + public DeleteableProvider deleteobj; + + public IEnumerable Tables { get; set; } + + public int ExecuteCommand() + { + var result = 0; + var sqlobj = deleteobj.ToSql(); + + foreach (var item in Tables) + { + var newsqlobj = GetSqlObj(sqlobj, item.TableName); + result +=this.Context.Ado.ExecuteCommand(newsqlobj.Key, newsqlobj.Value); + } + return result; + } + + public async Task ExecuteCommandAsync() + { + var result = 0; + var sqlobj = deleteobj.ToSql(); + foreach (var item in Tables) + { + var newsqlobj = GetSqlObj(sqlobj, item.TableName); + result +=await this.Context.Ado.ExecuteCommandAsync(newsqlobj.Key, newsqlobj.Value); + } + return result; + } + + private KeyValuePair> GetSqlObj(KeyValuePair> keyValuePair,string asName) + { + List pars = new List(); + string sql = keyValuePair.Key; + if (keyValuePair.Value != null) + { + pars = keyValuePair.Value.Select(it => new SugarParameter(it.ParameterName, it.Value)).ToList(); + } + sql = Regex.Replace(sql, deleteobj.EntityInfo.DbTableName, asName,RegexOptions.IgnoreCase); + return new KeyValuePair>(sql,pars); + } + + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 0e882fe5d..0d7d55855 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -841,6 +841,7 @@ namespace SqlSugar Context=Context, EntityInfo=this.EntityInfo }; + this.Context.MappingTables.Add(this.EntityInfo.EntityName, this.EntityInfo.DbTableName); var tables = getTableNamesFunc(helper.GetTables()); List> tableQueryables = new List>(); foreach (var item in tables) diff --git a/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs b/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs index 789e057d1..9da83f812 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IDeleteable.cs @@ -36,6 +36,7 @@ namespace SqlSugar IDeleteable RemoveDataCache(string likeString); KeyValuePair> ToSql(); IDeleteable EnableQueryFilter(); + SplitTableDeleteProvider SplitTable(Func, IEnumerable> getTableNamesFunc); void AddQueue(); } } diff --git a/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs b/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs index ca2c5d62f..72396e647 100644 --- a/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs +++ b/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs @@ -14,6 +14,8 @@ namespace SqlSugar public List GetTables() { + var oldIsEnableLogEvent = this.Context.Ado.IsEnableLogEvent; + this.Context.Ado.IsEnableLogEvent = false; var tableInfos = this.Context.DbMaintenance.GetTableInfoList(false); SplitTableHelper.CheckTableName(EntityInfo.DbTableName); var regex = EntityInfo.DbTableName.Replace("{year}", "([0-9]{2,4})").Replace("{day}", "([0-9]{1,2})").Replace("{month}", "([0-9]{1,2})"); @@ -31,6 +33,7 @@ namespace SqlSugar result.Add(tableInfo); } result = result.OrderByDescending(it => it.Date).ToList(); + this.Context.Ado.IsEnableLogEvent = oldIsEnableLogEvent; return result; } @@ -114,6 +117,7 @@ namespace SqlSugar Check.Exception(Regex.Matches(dbTableName, @"\{year\}").Count > 1, ErrorMessage.GetThrowMessage(" There can only be one {year}", " 只能有一个 {year}")); Check.Exception(Regex.Matches(dbTableName, @"\{month\}").Count > 1, ErrorMessage.GetThrowMessage("There can only be one {month}", "只能有一个 {month} ")); Check.Exception(Regex.Matches(dbTableName, @"\{day\}").Count > 1, ErrorMessage.GetThrowMessage("There can only be one {day}", "只能有一个{day}")); + Check.Exception(Regex.IsMatch(dbTableName, @"\d\{|\}\d"), ErrorMessage.GetThrowMessage(" '{' or '}' can't be numbers nearby", "占位符相令一位不能是数字,比例错误:1{day}2,正确: 1_{day}_2")); } #endregion } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 51ad95823..602ccc9eb 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -84,6 +84,7 @@ +