public static ShardingEntityConfig Parse(Type entityType)
        {
            if (!typeof(IShardingEntity).IsAssignableFrom(entityType))
            {
                throw new NotSupportedException(entityType.ToString());
            }
            PropertyInfo[]       shardingProperties   = entityType.GetProperties();
            ShardingEntityConfig shardingEntityConfig = null;

            foreach (var shardingProperty in shardingProperties)
            {
                var attribbutes = shardingProperty.GetCustomAttributes(true);
                if (attribbutes.FirstOrDefault(x => x.GetType() == typeof(ShardingKeyAttribute)) is ShardingKeyAttribute shardingKeyAttribute)
                {
                    if (shardingEntityConfig != null)
                    {
                        throw new ArgumentException($"{entityType}存在多个[ShardingKeyAttribute]");
                    }
                    shardingEntityConfig = new ShardingEntityConfig()
                    {
                        ShardingMode        = shardingKeyAttribute.ShardingMode,
                        ShardingEntityType  = entityType,
                        BeginTableTimeStamp = shardingKeyAttribute.BeginTableTimeStamp,
                        ShardingField       = shardingProperty.Name
                    };
                }
            }
            return(shardingEntityConfig);
        }
 public ShardingOperatorFilterVisitor(ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailWithFilter)
 {
     _shardingConfig      = shardingConfig;
     _shardingKeyConvert  = shardingKeyConvert;
     _keyToTailWithFilter = keyToTailWithFilter;
 }
        public static Func <string, bool> GetRouteObjectOperatorFilter <TKey>(IQueryable queryable, ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailExpression)
        {
            ShardingOperatorFilterVisitor <TKey> visitor = new ShardingOperatorFilterVisitor <TKey>(shardingConfig, shardingKeyConvert, keyToTailExpression);

            visitor.Visit(queryable.Expression);

            return(visitor.GetStringFilterTail());
        }