diff --git a/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs b/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs new file mode 100644 index 000000000..2fe21010d --- /dev/null +++ b/Src/Asp.Net/SqlServerTest/Demo/DemoN_SplitTable.cs @@ -0,0 +1,36 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest +{ + public class DemoN_SplitTable + { + public static void Init() + { + Console.WriteLine(""); + Console.WriteLine("#### CodeFirst Start ####"); + SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() + { + DbType = DbType.SqlServer, + ConnectionString = Config.ConnectionString, + InitKeyType = InitKeyType.Attribute, + IsAutoCloseConnection = true + }); + db.CodeFirst.SplitTables().InitTables(); + db.Queryable().SplitTable(it => it.Take(3)).ToList(); + Console.WriteLine("#### CodeFirst end ####"); + } + + [SqlSugar.SugarTable("Order{year}{month}{day}")] + public class OrderSpliteTest + { + [SugarColumn(IsPrimaryKey =true)] + public Guid Pk{ get; set; } + public string Name { get; set; } + } + } +} diff --git a/Src/Asp.Net/SqlServerTest/Program.cs b/Src/Asp.Net/SqlServerTest/Program.cs index 117a5cf10..7becdadef 100644 --- a/Src/Asp.Net/SqlServerTest/Program.cs +++ b/Src/Asp.Net/SqlServerTest/Program.cs @@ -19,6 +19,7 @@ namespace OrmTest Demo3_Insertable.Init(); Demo4_Deleteable.Init(); Demo5_SqlQueryable.Init(); + DemoN_SplitTable.Init(); Demo6_Queue.Init(); Demo7_Ado.Init(); Demo8_Saveable.Init(); diff --git a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj index 40a7e0d47..2d2df275d 100644 --- a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj +++ b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj @@ -82,6 +82,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs index 52ed59297..935437d18 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs @@ -24,6 +24,13 @@ namespace SqlSugar #endregion #region Public methods + public SplitCodeFirstProvider SplitTables() + { + var result = new SplitCodeFirstProvider(); + result.Context = this.Context; + return result; + } + public virtual ICodeFirst BackupTable(int maxBackupDataRows = int.MaxValue) { this.IsBackupTable = true; diff --git a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs new file mode 100644 index 000000000..937fa0126 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/SplitCodeFirstProvider.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SplitCodeFirstProvider + { + public SqlSugarProvider Context; + public void InitTables() + { + this.Context.InitMappingInfo(); + SplitTableHelper helper = new SplitTableHelper() + { + Context = this.Context, + EntityInfo = this.Context.EntityMaintenance.GetEntityInfo() + }; + var tables = helper.GetTables(); + var oldMapingTables = this.Context.MappingTables; + if (tables.Count >0) + { + foreach (var item in tables) + { + this.Context.MappingTables.Add(helper.EntityInfo.EntityName, item); + this.Context.CodeFirst.InitTables(typeof(T)); + } + } + else + { + this.Context.MappingTables.Add(helper.EntityInfo.EntityName, helper.GetDefaultTableName()); + this.Context.CodeFirst.InitTables(typeof(T)); + } + this.Context.MappingTables = oldMapingTables; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SplitInsertable.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SplitInsertable.cs new file mode 100644 index 000000000..e9197b2f2 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SplitInsertable.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SplitInsertable + { + + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 9955e59a6..97f6fd126 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -834,7 +834,22 @@ namespace SqlSugar } return result; } - + public ISugarQueryable SplitTable(Func, IEnumerable> getTableNamesFunc) + { + SplitTableHelper helper = new SplitTableHelper() + { + Context=Context, + EntityInfo=this.EntityInfo + }; + var tables = getTableNamesFunc(helper.GetTables()); + List> tableQueryables = new List>(); + foreach (var item in tables) + { + tableQueryables.Add(this.Context.Queryable().AS(item)); + } + var asName = this.Context.UnionAll(tableQueryables.ToArray()).Select().ToSql().Key; + return this.AS(asName); + } public ISugarQueryable Distinct() { QueryBuilder.IsDistinct = true; diff --git a/Src/Asp.Net/SqlSugar/Interface/ICodeFirst.cs b/Src/Asp.Net/SqlSugar/Interface/ICodeFirst.cs index 46b7af02d..6eb0e6a4c 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ICodeFirst.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ICodeFirst.cs @@ -17,5 +17,6 @@ namespace SqlSugar void InitTables(); void InitTables(); void InitTables(); + SplitCodeFirstProvider SplitTables(); } } diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 0e894654f..d5b059b46 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -179,6 +179,7 @@ namespace SqlSugar DataTable ToPivotTable(Func columnSelector,Expression> rowSelector,Func, TData> dataSelector); List ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); string ToPivotJson(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); + ISugarQueryable SplitTable(Func,IEnumerable> getTableNamesFunc); } public partial interface ISugarQueryable : ISugarQueryable { diff --git a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs index 473e1e02e..26e77b98c 100644 --- a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs @@ -45,6 +45,9 @@ namespace SqlSugar SqlServerBlukCopy UseSqlServer(); MySqlBlukCopy UseMySql(); OracleBlukCopy UseOracle(); + + //SplitInsertable SplitTable(SplitType splitType); + void AddQueue(); } diff --git a/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs b/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs new file mode 100644 index 000000000..11851dc7c --- /dev/null +++ b/Src/Asp.Net/SqlSugar/SpliteTable/SplitHelper.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace SqlSugar +{ + internal class SplitTableHelper + { + public SqlSugarProvider Context { get; set; } + public EntityInfo EntityInfo { get; set; } + public List GetTables() + { + + var tableInfos = this.Context.DbMaintenance.GetTableInfoList(false); + var regex = EntityInfo.DbTableName.Replace("{year}", "[0-9]{4}").Replace("{day}", "[0-9]{2}").Replace("{month}", "[0-9]{4}"); + var currentTables = tableInfos.Where(it => Regex.IsMatch(it.Name, regex, RegexOptions.IgnoreCase)).Select(it => it.Name).Reverse().ToList(); + return currentTables; + } + + public string GetDefaultTableName() + { + throw new NotImplementedException(); + } + } +} diff --git a/Src/Asp.Net/SqlSugar/SpliteTable/SplitType.cs b/Src/Asp.Net/SqlSugar/SpliteTable/SplitType.cs new file mode 100644 index 000000000..0c5f85130 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/SpliteTable/SplitType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public enum SplitType + { + Day=0, + Week=1, + Month=1 + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 91e6fd8a0..2277bb411 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -73,6 +73,7 @@ + @@ -88,6 +89,7 @@ + @@ -208,6 +210,8 @@ + +