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))); }
public IEnumerable <RouteResult> Route <T>(IQueryable <T> queryable, RouteRuleContext <T> ruleContext) { var engine = CreateEngine(); return(engine.Route(ruleContext)); }