public ShardingIQueryable(IQueryable <T> source, IVirtualTableManager virtualTableManager, IShardingDbContextProvider shardingDbContextProvider) { _entityType = typeof(T); _source = source; _virtualTable = (IVirtualTable <T>)virtualTableManager.GetVirtualTable(_entityType); _shardingDbContextProvider = shardingDbContextProvider; }
private void CreateDateTable(IVirtualTable virtualTable) { var virtualTableShardingConfig = virtualTable.ShardingConfig; var beginTime = virtualTableShardingConfig.BeginTableTimeStamp; var shardingModeEnum = virtualTableShardingConfig.ShardingMode; Func <long, long> nextTime = shardingModeEnum switch { ShardingModeEnum.Day => x => x.ConvertLongToTime().Date.AddDays(1).ConvertTimeToLong(), ShardingModeEnum.Week => x => x.ConvertLongToTime().Date.AddDays(7).ConvertTimeToLong(), ShardingModeEnum.Month => x => x.ConvertLongToTime().Date.AddMonths(1).ConvertTimeToLong(), ShardingModeEnum.Year => x => x.ConvertLongToTime().Date.AddYears(1).ConvertTimeToLong(), }; var nowTimeStamp = DateTime.Now.Date.ConvertTimeToLong(); if (beginTime > nowTimeStamp) { throw new ArgumentException("起始时间不正确无法生成正确的表名"); } var currentTimeStamp = beginTime; while (currentTimeStamp <= nowTimeStamp) { var tail = virtualTableShardingConfig.GetTableTailByField(currentTimeStamp); CreateTable(virtualTable, tail); //添加物理表 virtualTable.AddPhysicTable(new DefaultPhysicTable(virtualTable.GetOriginalTableName(), tail, virtualTable.EntityType)); currentTimeStamp = nextTime(currentTimeStamp); } }
/// <summary> /// 获取分表信息 /// </summary> /// <param name="virtualTable"></param> /// <returns></returns> public List <string> GetContextQueryTails(IVirtualTable virtualTable) { if (_shardingTables.ContainsKey(virtualTable)) { return(_shardingTables[virtualTable] ?? new List <string>(0)); } return(new List <string>(0)); }
private void CreateTable(IVirtualTable virtualTable, string suffix) { using var dbContext = _shardingDbContextProvider.CreateSingleShardingDbContext(suffix, virtualTable.EntityType); var databaseCreator = dbContext.Database.GetService <IDatabaseCreator>() as RelationalDatabaseCreator; try { databaseCreator.CreateTables(); } catch (Exception ex) { Console.WriteLine(ex.GetType()); } }
public void AddRoute(IVirtualTable virtualTable, string tail) { if (ManualTails.ContainsKey(virtualTable)) { var tails = ManualTails[virtualTable]; if (!tails.Contains(tail)) { tails.Add(tail); } } else { ManualTails.Add(virtualTable, new HashSet <string>() { tail }); } }
private void CreateDataTable(IVirtualTable virtualTable) { var shardingConfig = virtualTable.ShardingConfig; foreach (var tail in virtualTable.GetTaleAllTails()) { if (NeedCreateTable(shardingConfig)) { try { _tableCreator.CreateTable(virtualTable.EntityType, tail); } catch (Exception) { _logger.LogWarning($"table :{virtualTable.GetOriginalTableName()}{shardingConfig.TailPrefix}{tail} will created"); } } //添加物理表 virtualTable.AddPhysicTable(new DefaultPhysicTable(virtualTable, tail)); } }
/// <summary> /// 尝试添加本次操作表 /// </summary> /// <param name="virtualTable"></param> /// <param name="tails"></param> /// <returns></returns> public void TryAddShardingTable(IVirtualTable virtualTable, List <string> tails) { _shardingTables.Add(virtualTable, tails); }
/// <summary> /// 添加物理表 /// </summary> /// <param name="virtualTable"></param> /// <param name="physicTable"></param> public void AddPhysicTable(IVirtualTable virtualTable, IPhysicTable physicTable) { AddPhysicTable(virtualTable.EntityType, physicTable); }
/// <summary> /// 添加虚拟表 /// </summary> /// <param name="virtualTable"></param> public void AddVirtualTable(IVirtualTable virtualTable) { _virtualTables.TryAdd(virtualTable.EntityType, virtualTable); }
public DefaultPhysicTable(IVirtualTable virtualTable, string tail) { VirtualTable = virtualTable; OriginalName = virtualTable.GetOriginalTableName(); Tail = tail; }