Пример #1
0
        public override IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, object shardingKey)
        {
            var filter = GetRouteToFilter(ConvertToShardingKey(shardingKey), ShardingOperatorEnum.Equal).Compile();

            var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList();

            if (physicTables.IsEmpty())
            {
                var routeConfig = ShardingKeyUtil.Parse(typeof(T));
                throw new ShardingKeyRouteNotMatchException($"{routeConfig.ShardingEntityType} -> [{routeConfig.ShardingField}] ->【{shardingKey}】");
            }

            if (physicTables.Count > 1)
            {
                throw new ShardingKeyRouteMoreException($"table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}");
            }
            return(physicTables[0]);
        }
Пример #2
0
        protected override List <IPhysicTable> DoRouteWithWhere(List <IPhysicTable> allPhysicTables, IQueryable queryable)
        {
            //获取所有需要路由的表后缀
            var filter       = ShardingKeyUtil.GetRouteObjectOperatorFilter(queryable, ShardingKeyUtil.Parse(typeof(T)), ConvertToShardingKey, GetRouteToFilter);
            var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList();

            return(physicTables);
        }
Пример #3
0
 public OneDbVirtualTable(IServiceProvider serviceProvider)
 {
     _virtualRoute  = serviceProvider.GetService <IVirtualRoute <T> >() ?? throw new ShardingOwnerNotFoundException($"{EntityType}");
     ShardingConfig = ShardingKeyUtil.Parse(EntityType);
 }