示例#1
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);
        }
        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);
        }
示例#3
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]);
        }
示例#4
0
 public OneDbVirtualTable(IServiceProvider serviceProvider)
 {
     _virtualRoute  = serviceProvider.GetService <IVirtualRoute <T> >() ?? throw new ShardingOwnerNotFoundException($"{EntityType}");
     ShardingConfig = ShardingKeyUtil.Parse(EntityType);
 }
 public static ISet <Type> ParseQueryableRoute(this IQueryable queryable)
 {
     return(ShardingKeyUtil.GetShardingEntitiesFilter(queryable));
 }