diff --git a/samples/Sample.MySql/Controllers/WeatherForecastController.cs b/samples/Sample.MySql/Controllers/WeatherForecastController.cs index 68ad156a..3a381061 100644 --- a/samples/Sample.MySql/Controllers/WeatherForecastController.cs +++ b/samples/Sample.MySql/Controllers/WeatherForecastController.cs @@ -46,7 +46,7 @@ namespace Sample.MySql.Controllers // Console.WriteLine("------------"); // using (var tran = _defaultTableDbContext.Database.BeginTransaction()) // { - var sysUserMods = _defaultTableDbContext.Set(); + var sysUserMods = _defaultTableDbContext.Set().OrderBy(o=>o.Id).ThenBy(o=>o.Name); var resultX = await _defaultTableDbContext.Set() .Where(o => o.Id == "2" || o.Id == "3").FirstOrDefaultAsync(); var resultY = await _defaultTableDbContext.Set().FirstOrDefaultAsync(o => o.Id == "2" || o.Id == "3"); diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractVirtualTableRoute.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractVirtualTableRoute.cs index fb983bfa..aa85f10a 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractVirtualTableRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractVirtualTableRoute.cs @@ -96,10 +96,18 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions /// public abstract void Configure(EntityMetadataTableBuilder builder); + /// + /// 创建分页配置 + /// + /// public virtual IPaginationConfiguration CreatePaginationConfiguration() { return null; } + /// + /// 创建熟悉怒查询配置 + /// + /// public virtual IEntityQueryConfiguration CreateEntityQueryConfiguration() { return null; diff --git a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs index 67d2867a..0a1e49f6 100644 --- a/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs +++ b/src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitor.cs @@ -104,26 +104,45 @@ namespace ShardingCore.Core.Internal.Visitors { if (expression is MemberExpression member) { - if (member.Expression?.Type == _entityMetadata.EntityType || - MemberExpressionIsConvertAndOriginalIsEntityType(member)) + MemberExpression realMember = null; + if (member.Expression?.Type == _entityMetadata.EntityType) + { + realMember = member; + } + else if (MemberExpressionIsConvertAndOriginalIsEntityType(member,out realMember)) + { + } + + if (realMember != null) { var isShardingKey = false; if (_shardingTableRoute) { - isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(member.Member.Name); + isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(realMember.Member.Name); } else { - isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(member.Member.Name); + isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(realMember.Member.Name); } if (isShardingKey) { - shardingPredicateResult = new ShardingPredicateResult(true, member.Member.Name); + shardingPredicateResult = new ShardingPredicateResult(true, realMember.Member.Name); return true; } } } + // else if (expression is BinaryExpression binaryExpression) + // { + // if (IsShardingKey(binaryExpression.Left, out shardingPredicateResult)) + // { + // return true; + // } + // else if (IsShardingKey(binaryExpression.Right, out shardingPredicateResult)) + // { + // return true; + // } + // } shardingPredicateResult = _noShardingPredicateResult; return false; @@ -133,12 +152,30 @@ namespace ShardingCore.Core.Internal.Visitors /// 成员表达式是强转并且强转前的类型是当前对象 /// /// + /// /// - private bool MemberExpressionIsConvertAndOriginalIsEntityType(MemberExpression member) + private bool MemberExpressionIsConvertAndOriginalIsEntityType(MemberExpression member, + out MemberExpression realMember) { - return member.Expression?.NodeType == ExpressionType.Convert && - member.Expression is UnaryExpression unaryExpression && - unaryExpression.Operand.Type == _entityMetadata.EntityType; + if (member.Expression?.NodeType == ExpressionType.Convert && + member.Expression is UnaryExpression unaryExpression) + { + if (unaryExpression.Operand.Type == _entityMetadata.EntityType) + { + realMember = member; + return true; + } + + if (unaryExpression.Operand is MemberExpression m && + m.Expression?.Type == _entityMetadata.EntityType) + { + realMember = m; + return true; + } + } + + realMember = null; + return false; } /// diff --git a/test/ShardingCore.CommonTest/QueryableExtension.cs b/test/ShardingCore.CommonTest/QueryableExtension.cs new file mode 100644 index 00000000..8e00b07a --- /dev/null +++ b/test/ShardingCore.CommonTest/QueryableExtension.cs @@ -0,0 +1,30 @@ +using System.Linq.Expressions; + +namespace ShardingCore.CommonTest; + +public static class QueryableExtension +{ + public static IQueryable CheckBetween(this IQueryable baseQuery, S? valMin,S? valMax,Expression> field,bool includeMin=true,bool includeMax=true) where S : struct + { + + if (valMin == null && valMax == null) + { + return baseQuery; + } + else + { + IQueryable rv = baseQuery; + if (valMin != null) + { + BinaryExpression exp1 = !includeMin ? Expression.GreaterThan(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMin)) : Expression.GreaterThanOrEqual(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMin)); + rv = rv.Where(Expression.Lambda>(exp1, field.Parameters[0])); + } + if (valMax != null) + { + BinaryExpression exp2 = !includeMax ? Expression.LessThan(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMax)) : Expression.LessThanOrEqual(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMax)); + rv = rv.Where(Expression.Lambda>(exp2, field.Parameters[0])); + } + return rv; + } + } +} \ No newline at end of file diff --git a/test/ShardingCore.CommonTest/ShardingTableTime.cs b/test/ShardingCore.CommonTest/ShardingTableTime.cs index 47500f6a..27a8acde 100644 --- a/test/ShardingCore.CommonTest/ShardingTableTime.cs +++ b/test/ShardingCore.CommonTest/ShardingTableTime.cs @@ -9,6 +9,7 @@ using Xunit; namespace ShardingCore.CommonTest { + public class ShardingTableTime { private readonly EntityMetadata _testEntityMetadata; @@ -95,7 +96,7 @@ namespace ShardingCore.CommonTest var obj1 = new {time=new DateTime(2022, 1, 2)}; var queryables=new List>() { - + new List().AsQueryable().CheckBetween((DateTime?)queryTime,(DateTime?)queryTime3,o=>o.Time), new List().AsQueryable().Where(o=>o.Time==times2[0]), new List().AsQueryable().Where(o=>o.Time>=times2[0]&&o.Time().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time