using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Sample.SqlServerShardingDataSource.Entities; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.VirtualRoutes; using ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions; namespace Sample.SqlServerShardingDataSource.VirtualRoutes { public class SysUserVirtualDataSourceRoute : AbstractShardingOperatorVirtualDataSourceRoute { private readonly List _dataSources = new List() { "A", "B", "C" }; //我们设置区域就是数据库 public override string ShardingKeyToDataSourceName(object shardingKey) { return shardingKey?.ToString() ?? string.Empty; } public override List GetAllDataSourceNames() { return _dataSources; } public override bool AddDataSourceName(string dataSourceName) { if (_dataSources.Any(o => o == dataSourceName)) return false; _dataSources.Add(dataSourceName); return true; } public override Expression> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) { var t = ShardingKeyToDataSourceName(shardingKey); switch (shardingOperator) { case ShardingOperatorEnum.Equal: return tail => tail == t; default: { return tail => true; } } } public override void Configure(EntityMetadataDataSourceBuilder builder) { builder.ShardingProperty(o => o.Area); } } }