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/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..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; @@ -145,6 +146,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; @@ -381,7 +392,10 @@ public IShardingBuilder SetDateSharding(string shardingField, ExpandByD theTime = paramter.nextTime(theTime); } - + if (sharingOption.CreateShardingTableOnStarting) + { + _createShardingTableOnStartingFinishFun?.Invoke(); + } //定时自动建表 JobHelper.SetCronJob(() => { @@ -448,6 +462,12 @@ public IShardingBuilder SetHashModSharding(string shardingField, int mo return this; } + public IShardingBuilder CreateShardingTableOnStartingFinish(Action callback) + { + _createShardingTableOnStartingFinishFun = callback; + return this; + } + #endregion } } 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 => {