From 60ef9f4d6f5b2568b37f6b924dcd1d50a659d18b Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Fri, 24 Mar 2023 15:26:36 +0800 Subject: [PATCH] =?UTF-8?q?[#232]=20=E4=BF=AE=E5=A4=8DNullable?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=9C=A8=E6=AF=94=E8=BE=83=E6=97=B6=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=88=86=E7=89=87=E6=89=AB=E6=8F=8F=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E7=9A=84bug=E6=97=A0=E6=B3=95=E7=B2=BE=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- samples/Sample.MySql/Startup.cs | 16 +++---- .../Visitors/QueryableRouteDiscoverVisitor.cs | 43 ++++++++++++------- .../ShardingTableTime.cs | 3 ++ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/samples/Sample.MySql/Startup.cs b/samples/Sample.MySql/Startup.cs index b8cb6a5c..ce572fb0 100644 --- a/samples/Sample.MySql/Startup.cs +++ b/samples/Sample.MySql/Startup.cs @@ -182,14 +182,14 @@ namespace Sample.MySql // var shardingRuntimeContext = app.ApplicationServices.GetRequiredService(); // var entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); // var entityMetadata = entityMetadataManager.TryGet(); - // using (var scope = app.ApplicationServices.CreateScope()) - // { - // var defaultShardingDbContext = scope.ServiceProvider.GetService(); - // // if (defaultShardingDbContext.Database.GetPendingMigrations().Any()) - // { - // defaultShardingDbContext.Database.Migrate(); - // } - // } + using (var scope = app.ApplicationServices.CreateScope()) + { + var defaultShardingDbContext = scope.ServiceProvider.GetService(); + // if (defaultShardingDbContext.Database.GetPendingMigrations().Any()) + { + defaultShardingDbContext.Database.GenerateCreateScript(); + } + } app.ApplicationServices.UseAutoTryCompensateTable(); // using (var scope = app.ApplicationServices.CreateScope()) // { diff --git a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs index 34b74681..aad44a34 100644 --- a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs +++ b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs @@ -102,9 +102,9 @@ namespace ShardingCore.Core.Internal.Visitors private bool IsShardingKey(Expression expression, out ShardingPredicateResult shardingPredicateResult) { + MemberExpression realMember = null; if (expression is MemberExpression member) { - MemberExpression realMember = null; if (member.Expression?.Type == _entityMetadata.EntityType) { realMember = member; @@ -113,23 +113,34 @@ namespace ShardingCore.Core.Internal.Visitors { } - if (realMember != null) + } + else if (expression is UnaryExpression unaryExpression&& + unaryExpression.NodeType == ExpressionType.Convert + ) + { + + if (unaryExpression.Operand is MemberExpression m && + m.Expression?.Type == _entityMetadata.EntityType) { - var isShardingKey = false; - if (_shardingTableRoute) - { - isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(realMember.Member.Name); - } - else - { - isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(realMember.Member.Name); - } + realMember = m; + } + } + if (realMember != null) + { + var isShardingKey = false; + if (_shardingTableRoute) + { + isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(realMember.Member.Name); + } + else + { + isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(realMember.Member.Name); + } - if (isShardingKey) - { - shardingPredicateResult = new ShardingPredicateResult(true, realMember.Member.Name); - return true; - } + if (isShardingKey) + { + shardingPredicateResult = new ShardingPredicateResult(true, realMember.Member.Name); + return true; } } // else if (expression is BinaryExpression binaryExpression) diff --git a/test/ShardingCore.CommonTest/ShardingTableTime.cs b/test/ShardingCore.CommonTest/ShardingTableTime.cs index 21e208ad..5ad4e183 100644 --- a/test/ShardingCore.CommonTest/ShardingTableTime.cs +++ b/test/ShardingCore.CommonTest/ShardingTableTime.cs @@ -94,8 +94,11 @@ namespace ShardingCore.CommonTest var times1 = new List(){queryTime}; var times2 = new []{queryTime,queryTime2}; var obj1 = new {time=new DateTime(2022, 1, 2)}; + var dateTime = (DateTime?)new DateTime(2022, 1, 2); var queryables=new List>() { + new List().AsQueryable().Where(o=>o.Time== dateTime), + new List().AsQueryable().Where(o=>dateTime==o.Time ), new List().AsQueryable().Where(o=>o.Time== new DateTime(2022, 1, 2)), new List().AsQueryable().CheckBetween((DateTime?)queryTime,(DateTime?)queryTime3,o=>o.Time), new List().AsQueryable().Where(o=>o.Time==times2[0]),