From 229d5c1d3d23d48520a2e04a64f44dacad868ef3 Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Wed, 25 Aug 2021 13:05:45 +0800 Subject: [PATCH] 1 --- nuget-publish.bat | 6 +-- .../Controllers/ValuesController.cs | 38 +++++++++++-------- .../PaginationStreamMergeAsyncEnumerator.cs | 2 +- .../PaginationStreamMergeEnumerator.cs | 2 +- .../Sharding/ReWrite/ReWriteEngine.cs | 14 +++---- .../AsyncEnumerableStreamMergeEngine.cs | 15 +++++--- test/ShardingCore.Test50/ShardingTest.cs | 11 ++++++ test/ShardingCore.Test50_2x/ShardingTest.cs | 9 +++++ test/ShardingCore.Test50_3x/ShardingTest.cs | 9 +++++ 9 files changed, 73 insertions(+), 33 deletions(-) diff --git a/nuget-publish.bat b/nuget-publish.bat index d661f0cc..6e975d3c 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,8 +1,8 @@ :start ::定义版本 -set EFCORE2=2.2.0.11-pre -set EFCORE3=3.2.0.11-pre -set EFCORE5=5.2.0.11-pre +set EFCORE2=2.2.0.12 +set EFCORE3=3.2.0.12 +set EFCORE5=5.2.0.12 ::删除所有bin与obj下的文件 @echo off diff --git a/samples/Sample.SqlServer/Controllers/ValuesController.cs b/samples/Sample.SqlServer/Controllers/ValuesController.cs index d77c412f..8ddcbc1f 100644 --- a/samples/Sample.SqlServer/Controllers/ValuesController.cs +++ b/samples/Sample.SqlServer/Controllers/ValuesController.cs @@ -11,6 +11,10 @@ using ShardingCore.Extensions; namespace Sample.SqlServer.Controllers { + public class STU + { + public string Id { get; set; } + } [ApiController] [Route("[controller]/[action]")] public class ValuesController : ControllerBase @@ -26,33 +30,37 @@ namespace Sample.SqlServer.Controllers [HttpGet] public async Task Get() { - var resultx11231 = await _defaultTableDbContext.Set().Where(o => o.Age == 198198).Select(o=>o.Id).ContainsAsync("1981"); - var resultx1121 = await _defaultTableDbContext.Set().Where(o => o.Id == "198").SumAsync(o=>o.Age); + var resultx11231 = await _defaultTableDbContext.Set().Where(o => o.Age == 198198).Select(o => o.Id).ContainsAsync("1981"); + var resultx1121 = await _defaultTableDbContext.Set().Where(o => o.Id == "198").SumAsync(o => o.Age); var resultx111 = await _defaultTableDbContext.Set().FirstOrDefaultAsync(o => o.Id == "198"); - var resultx2 = await _defaultTableDbContext.Set().CountAsync(o => o.Age<=10); + var resultx2 = await _defaultTableDbContext.Set().CountAsync(o => o.Age <= 10); var resultx = await _defaultTableDbContext.Set().Where(o => o.Id == "198").FirstOrDefaultAsync(); - var resultx33 = await _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o=>o.Id).FirstOrDefaultAsync(); + var resultx33 = await _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefaultAsync(); var resulxxt = await _defaultTableDbContext.Set().Where(o => o.Id == "198").ToListAsync(); var result = await _defaultTableDbContext.Set().ToListAsync(); - var sresultx11231 = _defaultTableDbContext.Set().Where(o => o.Age == 198198).Select(o => o.Id).Contains("1981"); - var sresultx1121 = _defaultTableDbContext.Set().Where(o => o.Id == "198").Sum(o => o.Age); - var sresultx111 = _defaultTableDbContext.Set().FirstOrDefault(o => o.Id == "198"); - var sresultx2 = _defaultTableDbContext.Set().Count(o => o.Age <= 10); - var sresultx = _defaultTableDbContext.Set().Where(o => o.Id == "198").FirstOrDefault(); - var sresultx33 = _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); - var sresultxc = _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).ToList(); - var sresultxasdc = _defaultTableDbContext.Set().Where(o => o.Id == "198").ToList(); - var sresult = _defaultTableDbContext.Set().ToList(); + var sresultx11231 = _defaultTableDbContext.Set().Where(o => o.Age == 198198).Select(o => o.Id).Contains("1981"); + var sresultx1121 = _defaultTableDbContext.Set().Where(o => o.Id == "198").Sum(o => o.Age); + var sresultx111 = _defaultTableDbContext.Set().FirstOrDefault(o => o.Id == "198"); + var sresultx2 = _defaultTableDbContext.Set().Count(o => o.Age <= 10); + var sresultx = _defaultTableDbContext.Set().Where(o => o.Id == "198").FirstOrDefault(); + var sresultx33 = _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); + var sresultxc = _defaultTableDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).ToList(); + var sresultxasdc = _defaultTableDbContext.Set().Where(o => o.Id == "198").ToList(); + var sresult = _defaultTableDbContext.Set().ToList(); var sysUserMod98 = result.FirstOrDefault(o => o.Id == "98"); _defaultTableDbContext.Attach(sysUserMod98); - sysUserMod98.Name = "name_update"+new Random().Next(1,99)+"_98"; + sysUserMod98.Name = "name_update" + new Random().Next(1, 99) + "_98"; await _defaultTableDbContext.SaveChangesAsync(); - return Ok(result); + var stu = new STU() { Id = "198"}; + var sresultx111x = _defaultTableDbContext.Set().FirstOrDefault(o => o.Id == stu.Id); + + var pageResult = await _defaultTableDbContext.Set().Skip(10).Take(10).OrderBy(o => o.Age).ToListAsync(); + return Ok(sresultx111); } } } \ No newline at end of file diff --git a/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/PaginationStreamMergeAsyncEnumerator.cs b/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/PaginationStreamMergeAsyncEnumerator.cs index d0f2ab83..9aa79792 100644 --- a/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/PaginationStreamMergeAsyncEnumerator.cs +++ b/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/PaginationStreamMergeAsyncEnumerator.cs @@ -64,7 +64,7 @@ namespace ShardingCore.Sharding.Enumerators.StreamMergeAsync if (_take.HasValue) { realTake++; - if (realTake >= _take.Value) + if (realTake > _take.Value) return false; } } diff --git a/src/ShardingCore/Sharding/Enumerators/StreamMergeSync/PaginationStreamMergeEnumerator.cs b/src/ShardingCore/Sharding/Enumerators/StreamMergeSync/PaginationStreamMergeEnumerator.cs index a5274044..da4a4456 100644 --- a/src/ShardingCore/Sharding/Enumerators/StreamMergeSync/PaginationStreamMergeEnumerator.cs +++ b/src/ShardingCore/Sharding/Enumerators/StreamMergeSync/PaginationStreamMergeEnumerator.cs @@ -49,7 +49,7 @@ namespace ShardingCore.Sharding.Enumerators.StreamMergeSync if (_take.HasValue) { realTake++; - if (realTake >= _take.Value) + if (realTake > _take.Value) return false; } } diff --git a/src/ShardingCore/Sharding/ReWrite/ReWriteEngine.cs b/src/ShardingCore/Sharding/ReWrite/ReWriteEngine.cs index 67c47b9e..5f583bc0 100644 --- a/src/ShardingCore/Sharding/ReWrite/ReWriteEngine.cs +++ b/src/ShardingCore/Sharding/ReWrite/ReWriteEngine.cs @@ -30,18 +30,18 @@ namespace ShardingCore.Core.Internal.StreamMerge.ReWrite //去除分页,获取前Take+Skip数量 var reWriteQueryable = _queryable; - if (take.HasValue) - { - reWriteQueryable = _queryable.RemoveTake(); - } if (skip.HasValue) { reWriteQueryable = _queryable.RemoveSkip(); } + if (take.HasValue&& skip.GetValueOrDefault()>0) + { + reWriteQueryable = _queryable.RemoveTake(); + } - - if (take.HasValue) - reWriteQueryable = reWriteQueryable.Take(take.Value + skip.GetValueOrDefault()); + + //if (take.HasValue) + // reWriteQueryable = reWriteQueryable.Take(take.Value + skip.GetValueOrDefault()); //包含group by if (extraEntry.GroupByContext.GroupExpression != null) { diff --git a/src/ShardingCore/Sharding/StreamMergeEngines/AsyncEnumerableStreamMergeEngine.cs b/src/ShardingCore/Sharding/StreamMergeEngines/AsyncEnumerableStreamMergeEngine.cs index c64ffa1e..311a45fe 100644 --- a/src/ShardingCore/Sharding/StreamMergeEngines/AsyncEnumerableStreamMergeEngine.cs +++ b/src/ShardingCore/Sharding/StreamMergeEngines/AsyncEnumerableStreamMergeEngine.cs @@ -68,11 +68,12 @@ namespace ShardingCore.Sharding.StreamMergeEngines } #endif - private IQueryable CreateAsyncExecuteQueryable(RouteResult routeResult) + private IQueryable CreateAsyncExecuteQueryable(RouteResult routeResult,int routeCount) { var shardingDbContext = _mergeContext.CreateDbContext(routeResult); + var useOriginal = routeCount>1; _parllelDbbContexts.Add(shardingDbContext); - var newQueryable = (IQueryable) _mergeContext.GetReWriteQueryable() + var newQueryable = (IQueryable)(useOriginal?_mergeContext.GetReWriteQueryable():_mergeContext.GetOriginalQueryable()) .ReplaceDbContextQueryable(shardingDbContext); return newQueryable; } @@ -80,13 +81,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines private IAsyncEnumerator GetShardingEnumerator() { var tableResult = _mergeContext.GetRouteResults(); + var routeCount = tableResult.Count(); var enumeratorTasks = tableResult.Select(routeResult => { return Task.Run(async () => { try { - var newQueryable = CreateAsyncExecuteQueryable(routeResult); + var newQueryable = CreateAsyncExecuteQueryable(routeResult, routeCount); var asyncEnumerator = await GetAsyncEnumerator(newQueryable); return new StreamMergeAsyncEnumerator(asyncEnumerator); @@ -100,7 +102,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines }).ToArray(); var streamEnumerators = Task.WhenAll(enumeratorTasks).GetAwaiter().GetResult(); - if (_mergeContext.HasSkipTake()) + if (routeCount>1&&_mergeContext.HasSkipTake()) return new PaginationStreamMergeAsyncEnumerator(_mergeContext, streamEnumerators); if (_mergeContext.HasGroupQuery()) return new MultiAggregateOrderStreamMergeAsyncEnumerator(_mergeContext, streamEnumerators); @@ -118,13 +120,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines public IEnumerator GetEnumerator() { var tableResult = _mergeContext.GetRouteResults(); + var routeCount = tableResult.Count(); var enumeratorTasks = tableResult.Select(routeResult => { return Task.Run(() => { try { - var newQueryable = CreateAsyncExecuteQueryable(routeResult); + var newQueryable = CreateAsyncExecuteQueryable(routeResult, routeCount); var enumerator = GetEnumerator(newQueryable); return new StreamMergeEnumerator(enumerator); @@ -138,7 +141,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines }).ToArray(); var streamEnumerators = Task.WhenAll(enumeratorTasks).GetAwaiter().GetResult(); - if (_mergeContext.HasSkipTake()) + if (routeCount > 1 && _mergeContext.HasSkipTake()) return new PaginationStreamMergeEnumerator(_mergeContext, streamEnumerators); if (_mergeContext.HasGroupQuery()) return new MultiAggregateOrderStreamMergeEnumerator(_mergeContext, streamEnumerators); diff --git a/test/ShardingCore.Test50/ShardingTest.cs b/test/ShardingCore.Test50/ShardingTest.cs index 025e4083..c8249415 100644 --- a/test/ShardingCore.Test50/ShardingTest.cs +++ b/test/ShardingCore.Test50/ShardingTest.cs @@ -99,6 +99,17 @@ namespace ShardingCore.Test50 Assert.Equal(descAge, sysUserMod.Age); descAge--; } + + + + var pageResult = await _virtualDbContext.Set().Skip(10).Take(10).OrderByDescending(o => o.Age).ToListAsync(); + Assert.Equal(10, pageResult.Count); + int pageDescAge = 990; + foreach (var sysUserMod in pageResult) + { + Assert.Equal(pageDescAge, sysUserMod.Age); + pageDescAge--; + } } [Fact] diff --git a/test/ShardingCore.Test50_2x/ShardingTest.cs b/test/ShardingCore.Test50_2x/ShardingTest.cs index f8ee6f20..df9a43c6 100644 --- a/test/ShardingCore.Test50_2x/ShardingTest.cs +++ b/test/ShardingCore.Test50_2x/ShardingTest.cs @@ -96,6 +96,15 @@ namespace ShardingCore.Test50_2x Assert.Equal(descAge, sysUserMod.Age); descAge--; } + + var pageResult = await _virtualDbContext.Set().Skip(10).Take(10).OrderByDescending(o => o.Age).ToListAsync(); + Assert.Equal(10, pageResult.Count); + int pageDescAge = 990; + foreach (var sysUserMod in pageResult) + { + Assert.Equal(pageDescAge, sysUserMod.Age); + pageDescAge--; + } } [Fact] diff --git a/test/ShardingCore.Test50_3x/ShardingTest.cs b/test/ShardingCore.Test50_3x/ShardingTest.cs index 225da39c..32271ae5 100644 --- a/test/ShardingCore.Test50_3x/ShardingTest.cs +++ b/test/ShardingCore.Test50_3x/ShardingTest.cs @@ -96,6 +96,15 @@ namespace ShardingCore.Test50_3x Assert.Equal(descAge, sysUserMod.Age); descAge--; } + + var pageResult = await _virtualDbContext.Set().Skip(10).Take(10).OrderByDescending(o => o.Age).ToListAsync(); + Assert.Equal(10, pageResult.Count); + int pageDescAge = 990; + foreach (var sysUserMod in pageResult) + { + Assert.Equal(pageDescAge, sysUserMod.Age); + pageDescAge--; + } } [Fact]