예제 #1
0
        public static ShardingEntityConfig Parse(Type entityType)
        {
            if (!typeof(IShardingEntity).IsAssignableFrom(entityType))
            {
                throw new NotSupportedException(entityType.ToString());
            }
            if (_caches.TryGetValue(entityType, out var shardingEntityConfig))
            {
                return(shardingEntityConfig);
            }

            PropertyInfo[] shardingProperties = entityType.GetProperties();
            foreach (var shardingProperty in shardingProperties)
            {
                var attribbutes = shardingProperty.GetCustomAttributes(true);
                if (attribbutes.FirstOrDefault(x => x.GetType() == typeof(ShardingKeyAttribute)) is ShardingKeyAttribute shardingKeyAttribute)
                {
                    if (shardingEntityConfig != null)
                    {
                        throw new ArgumentException($"{entityType} found more than one [ShardingKeyAttribute]");
                    }
                    shardingEntityConfig = new ShardingEntityConfig()
                    {
                        ShardingEntityType = entityType,
                        ShardingField      = shardingProperty.Name,
                        AutoCreateTable    = shardingKeyAttribute.AutoCreateTableOnStart == ShardingKeyAutoCreateTableEnum.UnKnown?(bool?)null:(shardingKeyAttribute.AutoCreateTableOnStart == ShardingKeyAutoCreateTableEnum.Create),
                        TailPrefix         = shardingKeyAttribute.TailPrefix
                    };
                    _caches.TryAdd(entityType, shardingEntityConfig);
                }
            }

            return(shardingEntityConfig);
        }
 private bool NeedCreateTable(ShardingEntityConfig config)
 {
     if (config.AutoCreateTable.HasValue)
     {
         return(config.AutoCreateTable.Value);
     }
     return(_shardingCoreConfig.CreateShardingTableOnStart.GetValueOrDefault());
 }
예제 #3
0
        public static Func <string, bool> GetRouteObjectOperatorFilter <TKey>(IQueryable queryable, ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailExpression)
        {
            QueryableRouteDiscoverVisitor <TKey> visitor = new QueryableRouteDiscoverVisitor <TKey>(shardingConfig, shardingKeyConvert, keyToTailExpression);

            visitor.Visit(queryable.Expression);

            return(visitor.GetStringFilterTail());
        }
예제 #4
0
 public OneDbVirtualTable(IServiceProvider serviceProvider)
 {
     ShardingConfig = ShardingKeyParser.Parse(EntityType);
     _route         = (IVirtualRoute <T>)serviceProvider.GetService(typeof(IVirtualRoute <T>)) ?? throw new NotImplementedException($"未实现:[IVirtualRoute<T>]接口 T:[{EntityType}]");
 }
예제 #5
0
 public abstract IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, object shardingKeyValue);
예제 #6
0
 public abstract List <IPhysicTable> RouteWithWhere(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, IQueryable <T> queryable);
        public override IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, object shardingKeyValue)
        {
            var filter      = GetRouteToFilter(ConvertShardingKeyValue(shardingKeyValue), ShardingOperatorEnum.Equal).Compile();
            var physicTable = allPhysicTables.FirstOrDefault(o => filter(o.Tail));

            if (physicTable == null)
            {
                throw new Exception($"{shardingEntityConfig.ShardingEntityType} -> [{shardingEntityConfig.ShardingField}] -> <{shardingEntityConfig.ShardingMode}> -> 【{shardingKeyValue}】");
            }
            return(physicTable);
        }
        public override List <IPhysicTable> RouteWithWhere(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, IQueryable <T> queryable)
        {
            //获取所有需要路由的表后缀
            var filter       = ShardingKeyUtil.GetRouteObjectOperatorFilter(queryable, shardingEntityConfig, ConvertShardingKeyValue, GetRouteToFilter);
            var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList();

            if (physicTables.Count > 1)
            {
                throw new Exception($"表:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}");
            }
            return(physicTables);
        }
 public QueryableRouteDiscoverVisitor(ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailWithFilter)
 {
     _shardingConfig      = shardingConfig;
     _shardingKeyConvert  = shardingKeyConvert;
     _keyToTailWithFilter = keyToTailWithFilter;
 }