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 =>
{