diff --git a/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs b/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs index 0e21a6a5..ed7b785e 100644 --- a/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs +++ b/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs @@ -118,18 +118,16 @@ namespace ShardingCore6x public int N; - //[Benchmark] - //public async Task NoShardingFirstOrDefaultAsync() - //{ - // for (int i = 0; i < N; i++) - // { - // var next = new Random().Next(1, 3000000).ToString(); - // var queryable = _defaultShardingDbContext.Set().Where(o => o.Id == next); - // _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable)); - // var queryable1 = _defaultShardingDbContext.Set().Where(o => next== o.Id); - // _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable1)); - // } - //} + [Benchmark] + public async Task NoRouteParseCache() + { + for (int i = 0; i < N; i++) + { + var next = new Random().Next(1, 3000000).ToString(); + var queryable = _defaultShardingDbContext.Set().Where(o => o.Id == next); + _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable)); + } + } //[Benchmark] //public async Task ShardingFirstOrDefaultAsync() diff --git a/nuget-publish.bat b/nuget-publish.bat index 2deda9e8..80bb7854 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,9 +1,9 @@ :start ::定义版本 -set EFCORE2=2.3.1.60 -set EFCORE3=3.3.1.60 -set EFCORE5=5.3.1.60 -set EFCORE6=6.3.1.60 +set EFCORE2=2.3.1.61 +set EFCORE3=3.3.1.61 +set EFCORE5=5.3.1.61 +set EFCORE6=6.3.1.61 ::删除所有bin与obj下的文件 @echo off diff --git a/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingFilterVirtualDataSourceRoute.cs b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingFilterVirtualDataSourceRoute.cs index f575554e..f376c8a7 100644 --- a/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingFilterVirtualDataSourceRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingFilterVirtualDataSourceRoute.cs @@ -20,22 +20,22 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions /// /// 过滤虚拟路由用于处理强制路由、提示路由、路由断言 /// - /// + /// /// - public abstract class AbstractShardingFilterVirtualDataSourceRoute : AbstractVirtualDataSourceRoute where T : class + public abstract class AbstractShardingFilterVirtualDataSourceRoute : AbstractVirtualDataSourceRoute where TEntity : class { - public ShardingRouteContext CurrentShardingRouteContext => + public ShardingRouteContext CurrentShardingRouteContext => ShardingContainer.GetService().Current; /// /// 启用提示路由 /// - protected virtual bool EnableHintRoute => false; + protected virtual bool EnableHintRoute => false; /// /// 启用断言路由 /// protected virtual bool EnableAssertRoute => false; - public override List RouteWithPredicate(IQueryable queryable,bool isQuery) + public override List RouteWithPredicate(IQueryable queryable, bool isQuery) { var allDataSourceNames = GetAllDataSourceNames(); if (!isQuery) @@ -48,44 +48,55 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions { if (CurrentShardingRouteContext != null) { - if (CurrentShardingRouteContext.TryGetMustDataSource(out HashSet mustDataSources) && mustDataSources.IsNotEmpty()) + if (CurrentShardingRouteContext.TryGetMustDataSource(out HashSet mustDataSources) && mustDataSources.IsNotEmpty()) { var dataSources = allDataSourceNames.Where(o => mustDataSources.Contains(o)).ToList(); - if (dataSources.IsEmpty()||dataSources.Count!=mustDataSources.Count) + if (dataSources.IsEmpty() || dataSources.Count != mustDataSources.Count) throw new ShardingCoreException( - $" sharding data source route must error:[{EntityMetadata.EntityType.FullName}]-->[{string.Join(",",mustDataSources)}]"); + $" sharding data source route must error:[{EntityMetadata.EntityType.FullName}]-->[{string.Join(",", mustDataSources)}]"); return dataSources; } - if (CurrentShardingRouteContext.TryGetHintDataSource(out HashSet hintDataSources) && hintDataSources.IsNotEmpty()) + if (CurrentShardingRouteContext.TryGetHintDataSource(out HashSet hintDataSources) && hintDataSources.IsNotEmpty()) { var dataSources = allDataSourceNames.Where(o => hintDataSources.Contains(o)).ToList(); - if (dataSources.IsEmpty()||dataSources.Count!=hintDataSources.Count) + if (dataSources.IsEmpty() || dataSources.Count != hintDataSources.Count) throw new ShardingCoreException( - $" sharding data source route hint error:[{EntityMetadata.EntityType.FullName}]-->[{string.Join(",",hintDataSources)}]"); + $" sharding data source route hint error:[{EntityMetadata.EntityType.FullName}]-->[{string.Join(",", hintDataSources)}]"); return GetFilterDataSourceNames(allDataSourceNames, dataSources); } } } var filterDataSources = DoRouteWithPredicate(allDataSourceNames, queryable); - return GetFilterDataSourceNames(allDataSourceNames,filterDataSources); + return GetFilterDataSourceNames(allDataSourceNames, filterDataSources); } - + /// + /// 判断是调用全局还是内部断言 + /// + /// + /// + /// private List GetFilterDataSourceNames(List allDataSourceNames, List filterDataSources) { - //后拦截器 - var resultDataSources = AfterDataSourceFilter(allDataSourceNames, filterDataSources); - //最后处理断言 - ProcessAssertRoutes(allDataSourceNames, resultDataSources); - return resultDataSources; + if (UseAssertRoute) + { + //最后处理断言 + ProcessAssertRoutes(allDataSourceNames, filterDataSources); + return filterDataSources; + } + else + { + return AfterDataSourceFilter(allDataSourceNames, filterDataSources); + } } + private bool UseAssertRoute => EnableAssertRoute && CurrentShardingRouteContext != null && CurrentShardingRouteContext.TryGetAssertDataSource(out ICollection routeAsserts) && routeAsserts.IsNotEmpty(); - private void ProcessAssertRoutes(List allDataSources,List filterDataSources) + private void ProcessAssertRoutes(List allDataSources, List filterDataSources) { if (EnableAssertRoute) { - if (CurrentShardingRouteContext != null && CurrentShardingRouteContext.TryGetAssertDataSource(out ICollection routeAsserts) && routeAsserts.IsNotEmpty()) + if (CurrentShardingRouteContext != null && CurrentShardingRouteContext.TryGetAssertDataSource(out ICollection routeAsserts) && routeAsserts.IsNotEmpty()) { foreach (var routeAssert in routeAsserts) { diff --git a/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingOperatorVirtualDataSourceRoute.cs b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingOperatorVirtualDataSourceRoute.cs index e4958d70..4a0cc781 100644 --- a/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingOperatorVirtualDataSourceRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingOperatorVirtualDataSourceRoute.cs @@ -20,14 +20,17 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions /// /// 抽象类型抽象出对应的条件表达式 /// - /// + /// /// - public abstract class AbstractShardingOperatorVirtualDataSourceRoute : AbstractShardingFilterVirtualDataSourceRoute where T : class + public abstract class AbstractShardingOperatorVirtualDataSourceRoute : AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute where TEntity : class { protected override List DoRouteWithPredicate(List allDataSourceNames, IQueryable queryable) { - //获取所有需要路由的表后缀 - var filter = ShardingUtil.GetRouteShardingTableFilter(queryable, EntityMetadata, GetRouteToFilter,false); + //获取路由后缀表达式 + var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter, false); + //表达式缓存编译 + var filter = CachingCompile(routeParseExpression); + //通过编译结果进行过滤 var dataSources = allDataSourceNames.Where(o => filter(o)).ToList(); return dataSources; } diff --git a/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute.cs b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute.cs new file mode 100644 index 00000000..18a2e061 --- /dev/null +++ b/src/ShardingCore/Core/VirtualRoutes/DataSourceRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +using ShardingCore.Extensions; +using ShardingCore.Sharding.Visitors; + +namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions +{ + /// + /// 分库路由表达式解析缓存 + /// + /// + /// + public abstract class AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute : AbstractShardingFilterVirtualDataSourceRoute where TEntity : class + { + private static readonly ConcurrentDictionary>, Func> _routeCompileCaches = new(new ExtensionExpressionComparer.ExpressionEqualityComparer()); + + static AbstractShardingRouteParseCompileCacheVirtualDataSourceRoute() + { + Expression> defaultWhere1 = x => true; + _routeCompileCaches.TryAdd(defaultWhere1, defaultWhere1.Compile()); + Expression> defaultWhere2 = x => true; + var expression = defaultWhere2.And(defaultWhere1); + _routeCompileCaches.TryAdd(expression, expression.Compile()); + } + /// + /// 是否启用路由解析编译缓存 + /// + public virtual bool EnableRouteParseCompileCache => false; + /// + /// 对表达式进行缓存编译默认永久缓存单个参数表达式,且不包含orElse只包含单个AndAlso或者没有AndAlso的, + /// 比如:或者x]]>,不会缓存id>x && o.id等一共大于、等于、小于、大于等于、小于等于(不等于编译成true]]>)缓存会存在的数量个数上限为 + /// 表后缀x*5+2,当前表如果有300个后缀那么就是1502个缓存结果额外两个为true]]>和true and true]]> + /// + /// + /// + public virtual Func CachingCompile(Expression> parseWhere) + { + if (EnableRouteParseCompileCache) + { + var doCachingCompile = DoCachingCompile(parseWhere); + if (doCachingCompile != null) + return doCachingCompile; + doCachingCompile = CustomerCachingCompile(parseWhere); + if (doCachingCompile != null) + return doCachingCompile; + } + return parseWhere.Compile(); + } + /// + /// 系统默认永久单表达式缓存 + /// + /// + /// 返回null会走这个方法如果还是null就会调用方法 + protected virtual Func DoCachingCompile(Expression> parseWhere) + { + var shouldCache = ShouldCache(parseWhere); + if (shouldCache) + return _routeCompileCaches.GetOrAdd(parseWhere, key => parseWhere.Compile()); + return null; + } + /// + /// 表达式是否应该被缓存默认没有or并且and只有一个或者没有 + /// + /// + /// + protected bool ShouldCache(Expression whereExpression) + { + var routeParseCacheExpressionVisitor = new RouteParseCacheExpressionVisitor(); + routeParseCacheExpressionVisitor.Visit(whereExpression); + if (routeParseCacheExpressionVisitor.HasOrElse()) + return false; + if (routeParseCacheExpressionVisitor.AndAlsoCount() > 1) + return false; + return true; + } + + protected virtual Func CustomerCachingCompile(Expression> parseWhere) + { + return null; + } + } +} diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingFilterVirtualTableRoute.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingFilterVirtualTableRoute.cs index 232c26b2..b356c0f4 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingFilterVirtualTableRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingFilterVirtualTableRoute.cs @@ -63,22 +63,24 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions if (physicTables.IsEmpty()||physicTables.Count!=hintTails.Count) throw new ShardingCoreException( $" sharding route hint error:[{EntityMetadata.EntityType.FullName}]-->[{string.Join(",",hintTails)}]"); - if (UseAssertRoute) - { - ProcessAssertRoutes(allPhysicTables, physicTables); - return physicTables; - } - else - { - //后拦截器 - return AfterPhysicTableFilter(allPhysicTables, physicTables); - } + return GetFilterTableNames(allPhysicTables, physicTables); } } } var filterPhysicTables = DoRouteWithPredicate(allPhysicTables,queryable); + return GetFilterTableNames(allPhysicTables, filterPhysicTables); + } + + /// + /// 判断是调用全局过滤器还是调用内部断言 + /// + /// + /// + /// + private List GetFilterTableNames(List allPhysicTables, List filterPhysicTables) + { if (UseAssertRoute) { //最后处理断言 diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs index 115e2869..2e8f7e3c 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs @@ -16,12 +16,15 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions * @Date: Saturday, 19 December 2020 19:55:24 * @Email: 326308290@qq.com */ - public abstract class AbstractShardingOperatorVirtualTableRoute : AbstractShardingFilterVirtualTableRoute where TEntity : class + public abstract class AbstractShardingOperatorVirtualTableRoute : AbstractShardingRouteParseCompileCacheVirtualTableRoute where TEntity : class { protected override List DoRouteWithPredicate(List allPhysicTables, IQueryable queryable) { - //获取所有需要路由的表后缀 - var filter = ShardingUtil.GetRouteShardingTableFilter(queryable, EntityMetadata, GetRouteToFilter,true); + //获取路由后缀表达式 + var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter,true); + //表达式缓存编译 + var filter=CachingCompile(routeParseExpression); + //通过编译结果进行过滤 var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList(); return physicTables; } diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualTableRoute.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualTableRoute.cs index 33f77c4c..429b9961 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualTableRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingRouteParseCompileCacheVirtualTableRoute.cs @@ -1,38 +1,89 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.PhysicTables; +using ShardingCore.Extensions; +using ShardingCore.Sharding.Visitors; namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions { - public class AbstractShardingRouteParseCompileCacheVirtualTableRoute : AbstractShardingFilterVirtualTableRoute where TEntity : class + /// + /// 路由解析缓存 + /// + /// + /// + public abstract class AbstractShardingRouteParseCompileCacheVirtualTableRoute : AbstractShardingFilterVirtualTableRoute where TEntity : class { - public override string ShardingKeyToTail(object shardingKey) + private readonly ConcurrentDictionary>, Func> _routeCompileCaches = new(new ExtensionExpressionComparer.ExpressionEqualityComparer()); + + protected AbstractShardingRouteParseCompileCacheVirtualTableRoute() { - throw new NotImplementedException(); + Expression> defaultWhere1 = x => true; + _routeCompileCaches.TryAdd(defaultWhere1, defaultWhere1.Compile()); + Expression> defaultWhere2 = x => true; + var expression = defaultWhere2.And(defaultWhere1); + _routeCompileCaches.TryAdd(expression, expression.Compile()); + } + /// + /// 是否启用路由解析编译缓存 + /// + public virtual bool EnableRouteParseCompileCache => false; + /// + /// 对表达式进行缓存编译默认永久缓存单个参数表达式,且不包含orElse只包含单个AndAlso或者没有AndAlso的, + /// 比如:或者x]]>,不会缓存id>x && o.id等一共大于、等于、小于、大于等于、小于等于(不等于编译成true]]>)缓存会存在的数量个数上限为 + /// 表后缀x*5+2,当前表如果有300个后缀那么就是1502个缓存结果额外两个为true]]>和true and true]]> + /// + /// + /// + public virtual Func CachingCompile(Expression> parseWhere) + { + if (EnableRouteParseCompileCache) + { + var doCachingCompile = DoCachingCompile(parseWhere); + if (doCachingCompile != null) + return doCachingCompile; + doCachingCompile = CustomerCachingCompile(parseWhere); + if (doCachingCompile != null) + return doCachingCompile; + } + return parseWhere.Compile(); + } + /// + /// 系统默认永久单表达式缓存 + /// + /// + /// 返回null会走这个方法如果还是null就会调用方法 + protected virtual Func DoCachingCompile(Expression> parseWhere) + { + var shouldCache = ShouldCache(parseWhere); + if(shouldCache) + return _routeCompileCaches.GetOrAdd(parseWhere, key => parseWhere.Compile()); + return null; + } + /// + /// 表达式是否应该被缓存默认没有or并且and只有一个或者没有 + /// + /// + /// + protected bool ShouldCache(Expression whereExpression) + { + var routeParseCacheExpressionVisitor = new RouteParseCacheExpressionVisitor(); + routeParseCacheExpressionVisitor.Visit(whereExpression); + if (routeParseCacheExpressionVisitor.HasOrElse()) + return false; + if (routeParseCacheExpressionVisitor.AndAlsoCount() > 1) + return false; + return true; } - public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) + protected virtual Func CustomerCachingCompile(Expression> parseWhere) { - throw new NotImplementedException(); - } - - public override List GetAllTails() - { - throw new NotImplementedException(); - } - - public override void Configure(EntityMetadataTableBuilder builder) - { - throw new NotImplementedException(); - } - - protected override List DoRouteWithPredicate(List allPhysicTables, IQueryable queryable) - { - throw new NotImplementedException(); + return null; } } } diff --git a/src/ShardingCore/Sharding/ActualConnectionStringManager.cs b/src/ShardingCore/Sharding/ActualConnectionStringManager.cs index 2f42deb3..ce7c5878 100644 --- a/src/ShardingCore/Sharding/ActualConnectionStringManager.cs +++ b/src/ShardingCore/Sharding/ActualConnectionStringManager.cs @@ -34,8 +34,11 @@ namespace ShardingCore.Sharding _readWriteOptions = ShardingContainer.GetService>(); _shardingReadWriteManager = ShardingContainer.GetService(); _useReadWriteSeparation = _connectionStringManager is ReadWriteConnectionStringManager; - ReadWriteSeparationPriority = _readWriteOptions.ReadWritePriority; - ReadWriteSeparation = _readWriteOptions.ReadWriteSupport; + if (_readWriteOptions != null) + { + ReadWriteSeparationPriority = _readWriteOptions.ReadWritePriority; + ReadWriteSeparation = _readWriteOptions.ReadWriteSupport; + } } //public bool IsUseReadWriteSeparation() diff --git a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs index c0cf725e..5ec60053 100644 --- a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs +++ b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs @@ -27,17 +27,8 @@ namespace ShardingCore.Core.Internal.Visitors public class QueryableRouteShardingTableDiscoverVisitor : ExpressionVisitor { - private static readonly ConcurrentDictionary>, Func> _routeFilter = new(new ExtensionExpressionComparer.ExpressionEqualityComparer()); private readonly EntityMetadata _entityMetadata; private readonly Func>> _keyToTailWithFilter; - static QueryableRouteShardingTableDiscoverVisitor() - { - Expression> defaultWhere1 = x => true; - _routeFilter.TryAdd(defaultWhere1, defaultWhere1.Compile()); - Expression> defaultWhere2 = x => true; - var expression = defaultWhere1.And(defaultWhere2); - _routeFilter.TryAdd(expression, expression.Compile()); - } /// /// 是否是分表路由 /// @@ -51,42 +42,11 @@ namespace ShardingCore.Core.Internal.Visitors _shardingTableRoute = shardingTableRoute; } - public Func GetStringFilterTail() + public Expression> GetRouteParseExpression() { - //if (_lastExpression == null) - //{ - // _lastExpression = _where; - //} - //else - //{ - // var startNew = Stopwatch.StartNew(); - // for (int i = 0; i < 300; i++) - // { - // var exxq = LambdaCompare.Eq(_lastExpression, _where); - // } - // startNew.Stop(); - // var x = startNew.ElapsedMilliseconds; - // var eq = LambdaCompare.Eq(_lastExpression, _where); - // _lastExpression = _where; - //} - return _where.Compile(); - //var shouldCache = ShouldCache(_where); - //if (shouldCache) - // return _routeFilter.GetOrAdd(_where, key => _where.Compile()); - //return _where.Compile(); + return _where; } - private bool ShouldCache(Expression whereExpression) - { - var routeParseCacheExpressionVisitor = new RouteParseCacheExpressionVisitor(); - routeParseCacheExpressionVisitor.Visit(whereExpression); - if (routeParseCacheExpressionVisitor.HasOrElse()) - return false; - var hasAndAlsoCount = routeParseCacheExpressionVisitor.HasAndAlsoCount(); - if (hasAndAlsoCount > 1) - return false; - return true; - } private bool IsShardingKey(Expression expression) { diff --git a/src/ShardingCore/Sharding/Visitors/RouteParseCacheExpressionVisitor.cs b/src/ShardingCore/Sharding/Visitors/RouteParseCacheExpressionVisitor.cs index 9fda9c40..f06a187b 100644 --- a/src/ShardingCore/Sharding/Visitors/RouteParseCacheExpressionVisitor.cs +++ b/src/ShardingCore/Sharding/Visitors/RouteParseCacheExpressionVisitor.cs @@ -10,7 +10,8 @@ namespace ShardingCore.Sharding.Visitors internal class RouteParseCacheExpressionVisitor : ExpressionVisitor { private bool _hasOrElse = false; - private int _hasAndAlsoCount = 0; + private int _andAlsoCount = 0; + private int _equalCount = 0; protected override Expression VisitBinary(BinaryExpression node) { if (node.NodeType == ExpressionType.OrElse) @@ -21,7 +22,10 @@ namespace ShardingCore.Sharding.Visitors } }else if (node.NodeType == ExpressionType.AndAlso) { - _hasAndAlsoCount++; + _andAlsoCount++; + }else if (node.NodeType == ExpressionType.Equal) + { + _equalCount++; } return base.VisitBinary(node); } @@ -31,9 +35,13 @@ namespace ShardingCore.Sharding.Visitors return _hasOrElse; } - public int HasAndAlsoCount() + public int AndAlsoCount() { - return _hasAndAlsoCount; + return _andAlsoCount; + } + public int EqualCount() + { + return _equalCount; } } } diff --git a/src/ShardingCore/Utils/ShardingUtil.cs b/src/ShardingCore/Utils/ShardingUtil.cs index aae46b4f..dce1d8c6 100644 --- a/src/ShardingCore/Utils/ShardingUtil.cs +++ b/src/ShardingCore/Utils/ShardingUtil.cs @@ -52,14 +52,14 @@ namespace ShardingCore.Utils /// /// sharding table or data source /// - public static Func GetRouteShardingTableFilter(IQueryable queryable, EntityMetadata entityMetadata, Func>> keyToTailExpression,bool shardingTableRoute) + public static Expression> GetRouteParseExpression(IQueryable queryable, EntityMetadata entityMetadata, Func>> keyToTailExpression,bool shardingTableRoute) { QueryableRouteShardingTableDiscoverVisitor visitor = new QueryableRouteShardingTableDiscoverVisitor(entityMetadata, keyToTailExpression, shardingTableRoute); visitor.Visit(queryable.Expression); - return visitor.GetStringFilterTail(); + return visitor.GetRouteParseExpression(); } /// /// ȡβѯ漰Ķ diff --git a/test/ShardingCore.Test/ShardingTest.cs b/test/ShardingCore.Test/ShardingTest.cs index b0a4dc32..16e94899 100644 --- a/test/ShardingCore.Test/ShardingTest.cs +++ b/test/ShardingCore.Test/ShardingTest.cs @@ -445,6 +445,7 @@ namespace ShardingCore.Test [Fact] public async Task FirstOrDefault2() { + var sysUserModabxxxxx = await _virtualDbContext.Set().Where(o => o.DateOfMonth>=202102).FirstOrDefaultAsync(); var sysUserModabxxx = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); var sysUserModabxxx11 = await _virtualDbContext.Set().Where(o => o.Name == "name_2"|| o.Name == "name_3").FirstOrDefaultAsync(); var x=new Object [] { "1", "2" }; diff --git a/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs index d6b8e225..6f5ab013 100644 --- a/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test.Shardings { public class LogDayLongVirtualRoute:AbstractSimpleShardingDayKeyLongVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override void Configure(EntityMetadataTableBuilder builder) diff --git a/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs index aec4c41b..59e3c4c5 100644 --- a/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs @@ -10,6 +10,7 @@ namespace ShardingCore.Test.Shardings { public class LogDayVirtualTableRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override DateTime GetBeginTime() diff --git a/test/ShardingCore.Test/Shardings/LogMonthLongvirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogMonthLongvirtualRoute.cs index 3e254a16..c5bb5c6a 100644 --- a/test/ShardingCore.Test/Shardings/LogMonthLongvirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogMonthLongvirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test.Shardings { public class LogMonthLongvirtualRoute:AbstractSimpleShardingMonthKeyLongVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override bool AutoCreateTableByTime() diff --git a/test/ShardingCore.Test/Shardings/LogWeekDateTimeVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/LogWeekDateTimeVirtualTableRoute.cs index 30c78938..e8e8e4d8 100644 --- a/test/ShardingCore.Test/Shardings/LogWeekDateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogWeekDateTimeVirtualTableRoute.cs @@ -7,6 +7,7 @@ namespace ShardingCore.Test.Shardings { public class LogWeekDateTimeVirtualTableRoute:AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override bool AutoCreateTableByTime() diff --git a/test/ShardingCore.Test/Shardings/LogWeekTimeLongVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/LogWeekTimeLongVirtualTableRoute.cs index 71551f00..eac645a1 100644 --- a/test/ShardingCore.Test/Shardings/LogWeekTimeLongVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogWeekTimeLongVirtualTableRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test.Shardings { public class LogWeekTimeLongVirtualTableRoute : AbstractSimpleShardingWeekKeyLongVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override bool AutoCreateTableByTime() diff --git a/test/ShardingCore.Test/Shardings/LogYearDateTimeVirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogYearDateTimeVirtualRoute.cs index d9ffe6b4..2053fc1c 100644 --- a/test/ShardingCore.Test/Shardings/LogYearDateTimeVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogYearDateTimeVirtualRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test.Shardings { public class LogYearDateTimeVirtualRoute:AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override bool AutoCreateTableByTime() diff --git a/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs index 0ac75620..22ae24d2 100644 --- a/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test.Shardings { public class LogYearLongVirtualRoute:AbstractSimpleShardingYearKeyLongVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute => true; public override void Configure(EntityMetadataTableBuilder builder) diff --git a/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 3c598975..e06cf7b2 100644 --- a/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -10,6 +10,7 @@ namespace ShardingCore.Test.Shardings { public class OrderAreaShardingVirtualDataSourceRoute:AbstractShardingOperatorVirtualDataSourceRoute { + public override bool EnableRouteParseCompileCache => true; protected override bool EnableHintRoute =>true; private readonly List _dataSources = new List() diff --git a/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs index e72645e2..93df8fe9 100644 --- a/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -9,6 +9,7 @@ namespace ShardingCore.Test.Shardings { public class OrderCreateTimeVirtualTableRoute:AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { return new DateTime(2021, 1, 1); diff --git a/test/ShardingCore.Test/Shardings/SysUserModIntVirtualRoute.cs b/test/ShardingCore.Test/Shardings/SysUserModIntVirtualRoute.cs index 5cdb0fc5..2d6fff42 100644 --- a/test/ShardingCore.Test/Shardings/SysUserModIntVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/SysUserModIntVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test.Shardings public class SysUserModIntVirtualRoute:AbstractSimpleShardingModKeyIntVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModIntVirtualRoute() : base(2, 3) { diff --git a/test/ShardingCore.Test/Shardings/SysUserModVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/SysUserModVirtualTableRoute.cs index ce18b7e4..66f46052 100644 --- a/test/ShardingCore.Test/Shardings/SysUserModVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/SysUserModVirtualTableRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test.Shardings public class SysUserModVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModVirtualTableRoute() : base(2,3) { diff --git a/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs index 054d0f4f..8b9a30b2 100644 --- a/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -16,6 +16,7 @@ namespace ShardingCore.Test.Shardings */ public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override string ShardingKeyToTail(object shardingKey) { diff --git a/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs index 592cc5f7..fb4d7b1f 100644 --- a/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs @@ -10,6 +10,7 @@ namespace ShardingCore.Test2x.Shardings public class LogDayLongVirtualRoute:AbstractSimpleShardingDayKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs index 7ec3ef95..c7e4d41d 100644 --- a/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test2x.Shardings public class LogDayVirtualTableRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { diff --git a/test/ShardingCore.Test2x/Shardings/LogMonthLongvirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/LogMonthLongvirtualRoute.cs index 55f17212..e9441822 100644 --- a/test/ShardingCore.Test2x/Shardings/LogMonthLongvirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogMonthLongvirtualRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test2x.Shardings public class LogMonthLongvirtualRoute:AbstractSimpleShardingMonthKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test2x/Shardings/LogWeekDateTimeVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/LogWeekDateTimeVirtualTableRoute.cs index a630caf0..06c405c5 100644 --- a/test/ShardingCore.Test2x/Shardings/LogWeekDateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogWeekDateTimeVirtualTableRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test2x.Shardings public class LogWeekDateTimeVirtualTableRoute:AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test2x/Shardings/LogWeekTimeLongVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/LogWeekTimeLongVirtualTableRoute.cs index 226b9fb5..120dea42 100644 --- a/test/ShardingCore.Test2x/Shardings/LogWeekTimeLongVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogWeekTimeLongVirtualTableRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test2x.Shardings public class LogWeekTimeLongVirtualTableRoute : AbstractSimpleShardingWeekKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test2x/Shardings/LogYearDateTimeVirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/LogYearDateTimeVirtualRoute.cs index a77b526e..7e11da91 100644 --- a/test/ShardingCore.Test2x/Shardings/LogYearDateTimeVirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogYearDateTimeVirtualRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test2x.Shardings public class LogYearDateTimeVirtualRoute:AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test2x/Shardings/LogYearLongVirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/LogYearLongVirtualRoute.cs index 28fee656..b1d14221 100644 --- a/test/ShardingCore.Test2x/Shardings/LogYearLongVirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogYearLongVirtualRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test2x.Shardings public class LogYearLongVirtualRoute:AbstractSimpleShardingYearKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 86583e57..5e0eb12f 100644 --- a/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test2x.Shardings public class OrderAreaShardingVirtualDataSourceRoute:AbstractShardingOperatorVirtualDataSourceRoute { protected override bool EnableHintRoute =>true; + public override bool EnableRouteParseCompileCache => true; private readonly List _dataSources = new List() { diff --git a/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs index 6af65945..7f899a55 100644 --- a/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -9,6 +9,7 @@ namespace ShardingCore.Test2x.Shardings { public class OrderCreateTimeVirtualTableRoute:AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { return new DateTime(2021, 1, 1); diff --git a/test/ShardingCore.Test2x/Shardings/SysUserModIntVirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/SysUserModIntVirtualRoute.cs index 47732b8b..e3152ec0 100644 --- a/test/ShardingCore.Test2x/Shardings/SysUserModIntVirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/SysUserModIntVirtualRoute.cs @@ -7,6 +7,7 @@ namespace ShardingCore.Test2x.Shardings public class SysUserModIntVirtualRoute:AbstractSimpleShardingModKeyIntVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModIntVirtualRoute() : base(2, 3) { diff --git a/test/ShardingCore.Test2x/Shardings/SysUserModVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/SysUserModVirtualTableRoute.cs index 5b16baa3..4bebf866 100644 --- a/test/ShardingCore.Test2x/Shardings/SysUserModVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/SysUserModVirtualTableRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test2x.Shardings public class SysUserModVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModVirtualTableRoute() : base(2,3) { diff --git a/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs index 4836ebdc..d082aa48 100644 --- a/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -16,6 +16,7 @@ namespace ShardingCore.Test2x.Shardings */ public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override string ShardingKeyToTail(object shardingKey) { var time = Convert.ToInt32(shardingKey); diff --git a/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs index 4add99f9..8a6beb40 100644 --- a/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test3x.Shardings public class LogDayLongVirtualRoute:AbstractSimpleShardingDayKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs index 1f0b4aba..120b5cad 100644 --- a/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test3x.Shardings public class LogDayVirtualTableRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { diff --git a/test/ShardingCore.Test3x/Shardings/LogMonthLongvirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/LogMonthLongvirtualRoute.cs index ae252475..78d12df1 100644 --- a/test/ShardingCore.Test3x/Shardings/LogMonthLongvirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogMonthLongvirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test3x.Shardings public class LogMonthLongvirtualRoute:AbstractSimpleShardingMonthKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test3x/Shardings/LogWeekDateTimeVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/LogWeekDateTimeVirtualTableRoute.cs index 3f3242f8..13a4993e 100644 --- a/test/ShardingCore.Test3x/Shardings/LogWeekDateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogWeekDateTimeVirtualTableRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test3x.Shardings public class LogWeekDateTimeVirtualTableRoute:AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test3x/Shardings/LogWeekTimeLongVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/LogWeekTimeLongVirtualTableRoute.cs index 84f4147e..1ae46d98 100644 --- a/test/ShardingCore.Test3x/Shardings/LogWeekTimeLongVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogWeekTimeLongVirtualTableRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test3x.Shardings public class LogWeekTimeLongVirtualTableRoute : AbstractSimpleShardingWeekKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test3x/Shardings/LogYearDateTimeVirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/LogYearDateTimeVirtualRoute.cs index ca91662b..07f1aa71 100644 --- a/test/ShardingCore.Test3x/Shardings/LogYearDateTimeVirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogYearDateTimeVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test3x.Shardings public class LogYearDateTimeVirtualRoute:AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test3x/Shardings/LogYearLongVirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/LogYearLongVirtualRoute.cs index db6fb8ba..dca01f7c 100644 --- a/test/ShardingCore.Test3x/Shardings/LogYearLongVirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogYearLongVirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test3x.Shardings public class LogYearLongVirtualRoute:AbstractSimpleShardingYearKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 38cb6fe5..cfbd5b43 100644 --- a/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test3x.Shardings public class OrderAreaShardingVirtualDataSourceRoute:AbstractShardingOperatorVirtualDataSourceRoute { protected override bool EnableHintRoute =>true; + public override bool EnableRouteParseCompileCache => true; private readonly List _dataSources = new List() { diff --git a/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs index 29cc043d..4fbb8596 100644 --- a/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -9,6 +9,7 @@ namespace ShardingCore.Test3x.Shardings { public class OrderCreateTimeVirtualTableRoute:AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { return new DateTime(2021, 1, 1); diff --git a/test/ShardingCore.Test3x/Shardings/SysUserModIntVirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/SysUserModIntVirtualRoute.cs index b9791b57..4a3fe400 100644 --- a/test/ShardingCore.Test3x/Shardings/SysUserModIntVirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/SysUserModIntVirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test3x.Shardings { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModIntVirtualRoute() : base(2, 3) { } diff --git a/test/ShardingCore.Test3x/Shardings/SysUserModVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/SysUserModVirtualTableRoute.cs index 55fae85c..e66d802e 100644 --- a/test/ShardingCore.Test3x/Shardings/SysUserModVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/SysUserModVirtualTableRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test3x.Shardings public class SysUserModVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModVirtualTableRoute() : base(2,3) { diff --git a/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs index 01e42a95..e203f774 100644 --- a/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -17,6 +17,7 @@ namespace ShardingCore.Test3x.Shardings public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override string ShardingKeyToTail(object shardingKey) { var time = Convert.ToInt32(shardingKey); diff --git a/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs index b92bf4b5..211a51b8 100644 --- a/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test5x.Shardings public class LogDayLongVirtualRoute:AbstractSimpleShardingDayKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs index 8a17a5e2..66828c73 100644 --- a/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test5x.Shardings public class LogDayVirtualTableRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { diff --git a/test/ShardingCore.Test5x/Shardings/LogMonthLongvirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/LogMonthLongvirtualRoute.cs index fa21f669..d96caad6 100644 --- a/test/ShardingCore.Test5x/Shardings/LogMonthLongvirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogMonthLongvirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test5x.Shardings public class LogMonthLongvirtualRoute:AbstractSimpleShardingMonthKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test5x/Shardings/LogWeekDateTimeVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/LogWeekDateTimeVirtualTableRoute.cs index ee8493bf..2c904ad3 100644 --- a/test/ShardingCore.Test5x/Shardings/LogWeekDateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogWeekDateTimeVirtualTableRoute.cs @@ -8,6 +8,7 @@ namespace ShardingCore.Test5x.Shardings public class LogWeekDateTimeVirtualTableRoute:AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test5x/Shardings/LogWeekTimeLongVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/LogWeekTimeLongVirtualTableRoute.cs index 304ee554..516dc1b0 100644 --- a/test/ShardingCore.Test5x/Shardings/LogWeekTimeLongVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogWeekTimeLongVirtualTableRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test5x.Shardings public class LogWeekTimeLongVirtualTableRoute : AbstractSimpleShardingWeekKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test5x/Shardings/LogYearDateTimeVirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/LogYearDateTimeVirtualRoute.cs index 48889383..82f5b39e 100644 --- a/test/ShardingCore.Test5x/Shardings/LogYearDateTimeVirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogYearDateTimeVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test5x.Shardings public class LogYearDateTimeVirtualRoute:AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override bool AutoCreateTableByTime() { diff --git a/test/ShardingCore.Test5x/Shardings/LogYearLongVirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/LogYearLongVirtualRoute.cs index 220545cd..dc1e4ce9 100644 --- a/test/ShardingCore.Test5x/Shardings/LogYearLongVirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogYearLongVirtualRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test5x.Shardings public class LogYearLongVirtualRoute:AbstractSimpleShardingYearKeyLongVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 4769a572..3cafd754 100644 --- a/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -11,6 +11,7 @@ namespace ShardingCore.Test5x.Shardings public class OrderAreaShardingVirtualDataSourceRoute:AbstractShardingOperatorVirtualDataSourceRoute { protected override bool EnableHintRoute =>true; + public override bool EnableRouteParseCompileCache => true; private readonly List _dataSources = new List() { diff --git a/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs index 80d746f0..c2273329 100644 --- a/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -9,6 +9,7 @@ namespace ShardingCore.Test5x.Shardings { public class OrderCreateTimeVirtualTableRoute:AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override DateTime GetBeginTime() { return new DateTime(2021, 1, 1); diff --git a/test/ShardingCore.Test5x/Shardings/SysUserModIntVirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/SysUserModIntVirtualRoute.cs index 74a627b8..2cc29384 100644 --- a/test/ShardingCore.Test5x/Shardings/SysUserModIntVirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/SysUserModIntVirtualRoute.cs @@ -12,6 +12,7 @@ namespace ShardingCore.Test5x.Shardings public class SysUserModIntVirtualRoute:AbstractSimpleShardingModKeyIntVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModIntVirtualRoute() : base(2, 3) { diff --git a/test/ShardingCore.Test5x/Shardings/SysUserModVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/SysUserModVirtualTableRoute.cs index 8a4f6ffa..2d94bbee 100644 --- a/test/ShardingCore.Test5x/Shardings/SysUserModVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/SysUserModVirtualTableRoute.cs @@ -13,6 +13,7 @@ namespace ShardingCore.Test5x.Shardings public class SysUserModVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute { protected override bool EnableHintRoute => true; + public override bool EnableRouteParseCompileCache => true; public SysUserModVirtualTableRoute() : base(2,3) { diff --git a/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs index a4096127..b09ef734 100644 --- a/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -16,6 +16,7 @@ namespace ShardingCore.Test5x.Shardings */ public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute { + public override bool EnableRouteParseCompileCache => true; public override string ShardingKeyToTail(object shardingKey) { var time = Convert.ToInt32(shardingKey);