public IEnumerable <RouteResult> Route <T>(RouteRuleContext <T> routeRuleContext)
        {
            Dictionary <IVirtualTable, ISet <IPhysicTable> > routeMaps = new Dictionary <IVirtualTable, ISet <IPhysicTable> >();

            //先添加手动路由到当前上下文,之后将不再手动路由里面的自动路由添加到当前上下文
            foreach (var kv in routeRuleContext.ManualTails)
            {
                var virtualTable = kv.Key;
                var addTails     = kv.Value;
                var physicTables = virtualTable.GetAllPhysicTables().Where(o => addTails.Contains(o.Tail));
                if (!routeMaps.ContainsKey(virtualTable))
                {
                    routeMaps.Add(virtualTable, physicTables.ToHashSet());
                }
                else
                {
                    foreach (var physicTable in physicTables)
                    {
                        routeMaps[virtualTable].Add(physicTable);
                    }
                }
            }
            foreach (var kv in routeRuleContext.ManualPredicate)
            {
                var virtualTable = kv.Key;
                var predicate    = kv.Value;
                var physicTables = virtualTable.RouteTo(new RouteConfig(null, null, null, predicate));
                if (!routeMaps.ContainsKey(virtualTable))
                {
                    routeMaps.Add(virtualTable, physicTables.ToHashSet());
                }
                else
                {
                    foreach (var physicTable in physicTables)
                    {
                        routeMaps[virtualTable].Add(physicTable);
                    }
                }
            }

            if (routeRuleContext.AutoParseRoute)
            {
                var shardingEntities = routeRuleContext.Queryable.ParseQueryableRoute();
                foreach (var shardingEntity in shardingEntities)
                {
                    var virtualTable = _virtualTableManager.GetVirtualTable(shardingEntity);

                    var physicTables = virtualTable.RouteTo(new RouteConfig(routeRuleContext.Queryable));
                    if (!routeMaps.ContainsKey(virtualTable))
                    {
                        routeMaps.Add(virtualTable, physicTables.ToHashSet());
                    }
                    else
                    {
                        foreach (var physicTable in physicTables)
                        {
                            routeMaps[virtualTable].Add(physicTable);
                        }
                    }
                }
            }

            return(routeMaps.Select(o => o.Value).Cartesian().Select(o => new RouteResult(o)));
        }
Beispiel #2
0
        public IEnumerable <RouteResult> Route <T>(IQueryable <T> queryable, RouteRuleContext <T> ruleContext)
        {
            var engine = CreateEngine();

            return(engine.Route(ruleContext));
        }