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()); }