public RouteResult Route(ShardingRule shardingRule)
        {
            ICollection <RouteResult> result            = new List <RouteResult>(logicTables.Count);
            ICollection <String>      bindingTableNames = new SortedSet <string>(StringComparer.OrdinalIgnoreCase);

            foreach (var logicTable in logicTables)
            {
                var tableRule = shardingRule.FindTableRule(logicTable);
                if (tableRule != null)
                {
                    if (!bindingTableNames.Contains(logicTable))
                    {
                        result.Add(new ShardingStandardRoutingEngine(tableRule.LogicTable, sqlStatementContext, shardingConditions, properties).Route(shardingRule));
                    }
                    shardingRule.FindBindingTableRule(logicTable).IfPresent(bindingTableRule => bindingTableNames.AddAll(
                                                                                bindingTableRule.GetTableRules().Select(o => o.LogicTable).ToList()));
                }
            }
            if (result.IsEmpty())
            {
                throw new ShardingException($"Cannot find table rule and default data source with logic tables: '{logicTables}'");
            }
            if (1 == result.Count)
            {
                return(result.First());
            }
            return(new ShardingCartesianRoutingEngine(result).Route(shardingRule));
        }
        private List <IRouteValue> GetShardingValuesFromShardingConditions(ShardingRule shardingRule, ICollection <string> shardingColumns, ShardingCondition shardingCondition)
        {
            List <IRouteValue> result = new List <IRouteValue>(shardingColumns.Count);

            foreach (var routeValue in shardingCondition.RouteValues)
            {
                var bindingTableRule = shardingRule.FindBindingTableRule(LogicTableName);
                if ((LogicTableName.Equals(routeValue.GetTableName()) || bindingTableRule != null && bindingTableRule.HasLogicTable(LogicTableName)) &&
                    shardingColumns.Contains(routeValue.GetColumnName()))
                {
                    result.Add(routeValue);
                }
            }
            return(result);
        }