优化代码tableengine
This commit is contained in:
parent
9d80a3bb90
commit
36d8709efe
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using ShardingCore.Core.EntityMetadatas;
|
using ShardingCore.Core.EntityMetadatas;
|
||||||
using ShardingCore.Core.VirtualRoutes.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.Abstractions;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.DataSourceRoutes.RouteRuleEngine;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.MergeEngines.Common;
|
using ShardingCore.Sharding.MergeEngines.Common;
|
||||||
using ShardingCore.Sharding.MergeEngines.Common.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Common.Abstractions;
|
||||||
|
@ -28,6 +29,22 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine
|
||||||
_entityMetadataManager = entityMetadataManager;
|
_entityMetadataManager = entityMetadataManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<TableRouteUnit> GetEntityRouteUnit(DataSourceRouteResult dataSourceRouteResult,Type shardingEntity,IQueryable queryable)
|
||||||
|
{
|
||||||
|
if (!_entityMetadataManager.IsShardingTable(shardingEntity))
|
||||||
|
{
|
||||||
|
var dataSourceNames = dataSourceRouteResult.IntersectDataSources;
|
||||||
|
var tableRouteUnits = new List<TableRouteUnit>(dataSourceNames.Count);
|
||||||
|
foreach (var dataSourceName in dataSourceNames)
|
||||||
|
{
|
||||||
|
var shardingRouteUnit = new TableRouteUnit(dataSourceName, string.Empty, shardingEntity);
|
||||||
|
tableRouteUnits.Add(shardingRouteUnit);
|
||||||
|
}
|
||||||
|
return tableRouteUnits;
|
||||||
|
}
|
||||||
|
var virtualTableRoute = _tableRouteManager.GetRoute(shardingEntity);
|
||||||
|
return virtualTableRoute.RouteWithPredicate(dataSourceRouteResult, queryable, true);
|
||||||
|
}
|
||||||
public ShardingRouteResult Route(TableRouteRuleContext tableRouteRuleContext)
|
public ShardingRouteResult Route(TableRouteRuleContext tableRouteRuleContext)
|
||||||
{
|
{
|
||||||
Dictionary<string /*dataSourceName*/, Dictionary<Type /*entityType*/, ISet<TableRouteUnit>>> routeMaps =
|
Dictionary<string /*dataSourceName*/, Dictionary<Type /*entityType*/, ISet<TableRouteUnit>>> routeMaps =
|
||||||
|
@ -38,41 +55,13 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine
|
||||||
foreach (var shardingEntityKv in queryEntities)
|
foreach (var shardingEntityKv in queryEntities)
|
||||||
{
|
{
|
||||||
var shardingEntity = shardingEntityKv.Key;
|
var shardingEntity = shardingEntityKv.Key;
|
||||||
if (!_entityMetadataManager.IsShardingTable(shardingEntity))
|
var shardingRouteUnits = GetEntityRouteUnit(tableRouteRuleContext.DataSourceRouteResult,shardingEntity, shardingEntityKv.Value ?? tableRouteRuleContext.Queryable);
|
||||||
{
|
|
||||||
var dataSourceNames = tableRouteRuleContext.DataSourceRouteResult.IntersectDataSources;
|
|
||||||
foreach (var dataSourceName in dataSourceNames)
|
|
||||||
{
|
|
||||||
var shardingRouteUnit = new TableRouteUnit(dataSourceName, string.Empty, shardingEntity);
|
|
||||||
if (!routeMaps.ContainsKey(dataSourceName))
|
|
||||||
{
|
|
||||||
routeMaps.Add(dataSourceName,
|
|
||||||
new Dictionary<Type, ISet<TableRouteUnit>>()
|
|
||||||
{ { shardingEntity, new HashSet<TableRouteUnit>() { shardingRouteUnit } } });
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var routeMap = routeMaps[dataSourceName];
|
|
||||||
if (!routeMap.ContainsKey(shardingEntity))
|
|
||||||
{
|
|
||||||
routeMap.Add(shardingEntity, new HashSet<TableRouteUnit>() { shardingRouteUnit });
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
routeMap[shardingEntity].Add(shardingRouteUnit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var virtualTableRoute = _tableRouteManager.GetRoute(shardingEntity);
|
|
||||||
var shardingRouteUnits = virtualTableRoute.RouteWithPredicate(
|
|
||||||
tableRouteRuleContext.DataSourceRouteResult,
|
|
||||||
(shardingEntityKv.Value ?? tableRouteRuleContext.Queryable), true);
|
|
||||||
foreach (var shardingRouteUnit in shardingRouteUnits)
|
foreach (var shardingRouteUnit in shardingRouteUnits)
|
||||||
{
|
{
|
||||||
var dataSourceName = shardingRouteUnit.DataSourceName;
|
var dataSourceName = shardingRouteUnit.DataSourceName;
|
||||||
|
|
||||||
|
|
||||||
if (!routeMaps.ContainsKey(dataSourceName))
|
if (!routeMaps.ContainsKey(dataSourceName))
|
||||||
{
|
{
|
||||||
routeMaps.Add(dataSourceName,
|
routeMaps.Add(dataSourceName,
|
||||||
|
@ -148,5 +137,6 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine
|
||||||
// return sqlRouteUnits;
|
// return sqlRouteUnits;
|
||||||
// return routeMaps.Select(o => o.Value).Cartesian().Where(o=>o).Select(o => new TableRouteResult(o,_shardingDatabaseProvider.GetShardingDbContextType()));
|
// return routeMaps.Select(o => o.Value).Cartesian().Where(o=>o).Select(o => new TableRouteResult(o,_shardingDatabaseProvider.GetShardingDbContextType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue