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);
 }
Example #10
0
 public DefaultPhysicTable(IVirtualTable virtualTable, string tail)
 {
     VirtualTable = virtualTable;
     OriginalName = virtualTable.GetOriginalTableName();
     Tail         = tail;
 }