From 7dddeef44e6e35f82d3e8d09996488996765220c Mon Sep 17 00:00:00 2001 From: hsxian <940100027@qq.com> Date: Sun, 18 Aug 2024 10:43:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E6=9F=A5=E8=AF=A2=E6=97=B6,=E5=85=88?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E8=A1=A8,=E6=8F=90=E9=AB=98=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyInjection/IShardingConfig.cs | 4 +++- .../DependencyInjection/ShardingContainer.cs | 10 ++++++++++ src/EFCore.Sharding/Sharding/IShardingQueryable.T.cs | 2 +- src/EFCore.Sharding/Sharding/ShardingIQueryable.T.cs | 6 ++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/EFCore.Sharding/DependencyInjection/IShardingConfig.cs b/src/EFCore.Sharding/DependencyInjection/IShardingConfig.cs index 3deb1d1..708f540 100644 --- a/src/EFCore.Sharding/DependencyInjection/IShardingConfig.cs +++ b/src/EFCore.Sharding/DependencyInjection/IShardingConfig.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace EFCore.Sharding @@ -7,6 +8,7 @@ internal interface IShardingConfig { DatabaseType FindADbType(); List<(string suffix, string conString, DatabaseType dbType)> GetReadTables(IQueryable source); + List<(string suffix, string conString, DatabaseType dbType)> GetReadTables(IQueryable source, DateTime s, DateTime e); List<(string suffix, string conString, DatabaseType dbType)> GetWriteTables(IQueryable source = null); (string suffix, string conString, DatabaseType dbType) GetTheWriteTable(T obj); } diff --git a/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs b/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs index 83ef5ea..f386692 100644 --- a/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs +++ b/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs @@ -145,6 +145,16 @@ private void AddShardingTable(string absTableName, string fullTableName) return FilterTable(allTables, source); } + public List<(string suffix, string conString, DatabaseType dbType)> GetReadTables(IQueryable source, DateTime s, DateTime e) + { + var allTables = GetTargetTables(ReadWriteType.Read); + var ret = FilterTable(allTables, source); + var entityType = typeof(T); + var rule = _shardingRules.Where(x => x.EntityType == entityType).FirstOrDefault(); + var sT = rule.GetTableSuffixByField(s); + var eT = rule.GetTableSuffixByField(e); + return ret.Where(t => t.suffix.CompareTo(sT) >= 0 && t.suffix.CompareTo(eT) <= 0).ToList(); + } public DatabaseType FindADbType() { return _dataSources.FirstOrDefault().DbType; diff --git a/src/EFCore.Sharding/Sharding/IShardingQueryable.T.cs b/src/EFCore.Sharding/Sharding/IShardingQueryable.T.cs index d396845..dd69292 100644 --- a/src/EFCore.Sharding/Sharding/IShardingQueryable.T.cs +++ b/src/EFCore.Sharding/Sharding/IShardingQueryable.T.cs @@ -86,7 +86,7 @@ public interface IShardingQueryable where T : class /// 异步获取列表 /// /// - Task> ToListAsync(); + Task> ToListAsync((DateTime s, DateTime e)? range = null); /// /// 获取第一个,若不存在则返回默认值 diff --git a/src/EFCore.Sharding/Sharding/ShardingIQueryable.T.cs b/src/EFCore.Sharding/Sharding/ShardingIQueryable.T.cs index d63895a..bc24951 100644 --- a/src/EFCore.Sharding/Sharding/ShardingIQueryable.T.cs +++ b/src/EFCore.Sharding/Sharding/ShardingIQueryable.T.cs @@ -152,7 +152,7 @@ public List ToList() { return AsyncHelper.RunSync(() => ToListAsync()); } - public async Task> ToListAsync() + public async Task> ToListAsync((DateTime s, DateTime e)? range = null) { //去除分页,获取前Take+Skip数量 int? take = _source.GetTakeCount(); @@ -164,7 +164,9 @@ public async Task> ToListAsync() noPaginSource = noPaginSource.Take(take.Value + skip.Value); //从各个分表获取数据 - var tables = _shardingConfig.GetReadTables(_source); + var tables = range == null ? _shardingConfig.GetReadTables(_source) + : _shardingConfig.GetReadTables(_source, range.Value.s, range.Value.e) + ; SynchronizedCollection dbs = new SynchronizedCollection(); List>> tasks = tables.Select(aTable => { From 5379e9f25a999e73cff0667a4bdaaa2f8bdbdbe2 Mon Sep 17 00:00:00 2001 From: hsxian <940100027@qq.com> Date: Thu, 24 Oct 2024 16:45:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E8=A1=A8=E5=AE=8C=E6=88=90=E7=9A=84=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E3=80=82=E5=8F=AA=E6=9C=89=E8=A1=A8=E5=88=9B=E5=BB=BA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E6=89=8D=E5=8F=AF=E8=AF=BB=E5=86=99=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=A8=EF=BC=8C=E5=90=A6=E5=88=99=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyInjection/IShardingBuilder.cs | 7 +++++++ .../DependencyInjection/ShardingContainer.cs | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs b/src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs index 87c376c..52edb7c 100644 --- a/src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs +++ b/src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs @@ -43,6 +43,13 @@ public interface IShardingBuilder /// IShardingBuilder CreateShardingTableOnStarting(bool enable); + /// + /// 启动时创建表完成 + /// + /// + /// + IShardingBuilder CreateShardingTableOnStartingFinish(Action callback); + /// /// 是否启用分表数据库迁移,默认false /// diff --git a/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs b/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs index f386692..6b239da 100644 --- a/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs +++ b/src/EFCore.Sharding/DependencyInjection/ShardingContainer.cs @@ -13,6 +13,7 @@ internal class ShardingContainer : IShardingConfig, IShardingBuilder #region 构造函数 private readonly IServiceCollection _services; + private Action _createShardingTableOnStartingFinishFun = null; public ShardingContainer(IServiceCollection services) { _services = services; @@ -391,7 +392,10 @@ public IShardingBuilder SetDateSharding(string shardingField, ExpandByD theTime = paramter.nextTime(theTime); } - + if (sharingOption.CreateShardingTableOnStarting) + { + _createShardingTableOnStartingFinishFun?.Invoke(); + } //定时自动建表 JobHelper.SetCronJob(() => { @@ -458,6 +462,12 @@ public IShardingBuilder SetHashModSharding(string shardingField, int mo return this; } + public IShardingBuilder CreateShardingTableOnStartingFinish(Action callback) + { + _createShardingTableOnStartingFinishFun = callback; + return this; + } + #endregion } }