protected override List <IPhysicTable> DoRouteWithWhere(List <IPhysicTable> allPhysicTables, IQueryable queryable) { //获取所有需要路由的表后缀 var filter = ShardingKeyUtil.GetRouteObjectOperatorFilter(queryable, ShardingKeyUtil.Parse(typeof(T)), ConvertToShardingKey, GetRouteToFilter); var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList(); return(physicTables); }
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 override IPhysicTable RouteWithValue(List <IPhysicTable> allPhysicTables, object shardingKey) { var filter = GetRouteToFilter(ConvertToShardingKey(shardingKey), ShardingOperatorEnum.Equal).Compile(); var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList(); if (physicTables.IsEmpty()) { var routeConfig = ShardingKeyUtil.Parse(typeof(T)); throw new ShardingKeyRouteNotMatchException($"{routeConfig.ShardingEntityType} -> [{routeConfig.ShardingField}] ->【{shardingKey}】"); } if (physicTables.Count > 1) { throw new ShardingKeyRouteMoreException($"table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); } return(physicTables[0]); }
public OneDbVirtualTable(IServiceProvider serviceProvider) { _virtualRoute = serviceProvider.GetService <IVirtualRoute <T> >() ?? throw new ShardingOwnerNotFoundException($"{EntityType}"); ShardingConfig = ShardingKeyUtil.Parse(EntityType); }
public static ISet <Type> ParseQueryableRoute(this IQueryable queryable) { return(ShardingKeyUtil.GetShardingEntitiesFilter(queryable)); }