public static ShardingEntityConfig Parse(Type entityType) { if (!typeof(IShardingEntity).IsAssignableFrom(entityType)) { throw new NotSupportedException(entityType.ToString()); } if (_caches.TryGetValue(entityType, out var shardingEntityConfig)) { return(shardingEntityConfig); } PropertyInfo[] shardingProperties = entityType.GetProperties(); 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} found more than one [ShardingKeyAttribute]"); } shardingEntityConfig = new ShardingEntityConfig() { ShardingEntityType = entityType, ShardingField = shardingProperty.Name, AutoCreateTable = shardingKeyAttribute.AutoCreateTableOnStart == ShardingKeyAutoCreateTableEnum.UnKnown?(bool?)null:(shardingKeyAttribute.AutoCreateTableOnStart == ShardingKeyAutoCreateTableEnum.Create), TailPrefix = shardingKeyAttribute.TailPrefix }; _caches.TryAdd(entityType, shardingEntityConfig); } } return(shardingEntityConfig); }
private bool NeedCreateTable(ShardingEntityConfig config) { if (config.AutoCreateTable.HasValue) { return(config.AutoCreateTable.Value); } return(_shardingCoreConfig.CreateShardingTableOnStart.GetValueOrDefault()); }
public static Func <string, bool> GetRouteObjectOperatorFilter <TKey>(IQueryable queryable, ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailExpression) { QueryableRouteDiscoverVisitor <TKey> visitor = new QueryableRouteDiscoverVisitor <TKey>(shardingConfig, shardingKeyConvert, keyToTailExpression); visitor.Visit(queryable.Expression); return(visitor.GetStringFilterTail()); }
public OneDbVirtualTable(IServiceProvider serviceProvider) { ShardingConfig = ShardingKeyParser.Parse(EntityType); _route = (IVirtualRoute <T>)serviceProvider.GetService(typeof(IVirtualRoute <T>)) ?? throw new NotImplementedException($"未实现:[IVirtualRoute<T>]接口 T:[{EntityType}]"); }
public abstract IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, object shardingKeyValue);
public abstract List <IPhysicTable> RouteWithWhere(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, IQueryable <T> queryable);
public override IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, object shardingKeyValue) { var filter = GetRouteToFilter(ConvertShardingKeyValue(shardingKeyValue), ShardingOperatorEnum.Equal).Compile(); var physicTable = allPhysicTables.FirstOrDefault(o => filter(o.Tail)); if (physicTable == null) { throw new Exception($"{shardingEntityConfig.ShardingEntityType} -> [{shardingEntityConfig.ShardingField}] -> <{shardingEntityConfig.ShardingMode}> -> 【{shardingKeyValue}】"); } return(physicTable); }
public override List <IPhysicTable> RouteWithWhere(List <IPhysicTable> allPhysicTables, ShardingEntityConfig shardingEntityConfig, IQueryable <T> queryable) { //获取所有需要路由的表后缀 var filter = ShardingKeyUtil.GetRouteObjectOperatorFilter(queryable, shardingEntityConfig, ConvertShardingKeyValue, GetRouteToFilter); var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList(); if (physicTables.Count > 1) { throw new Exception($"表:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); } return(physicTables); }
public QueryableRouteDiscoverVisitor(ShardingEntityConfig shardingConfig, Func <object, TKey> shardingKeyConvert, Func <TKey, ShardingOperatorEnum, Expression <Func <string, bool> > > keyToTailWithFilter) { _shardingConfig = shardingConfig; _shardingKeyConvert = shardingKeyConvert; _keyToTailWithFilter = keyToTailWithFilter; }