From 4cd1a8a073489ae21497a0dbfbfb97d1fffbb43b Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Mon, 4 Jul 2022 12:27:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=E5=AE=8C=E6=88=90first?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20220704042701_init.Designer.cs | 76 +++++++++++++++++++ .../Migrations/20220704042701_init.cs | 73 ++++++++++++++++++ .../DefaultShardingDbContextModelSnapshot.cs | 74 ++++++++++++++++++ .../StreamMergeEnumerableExtension.cs | 2 +- ...stOrDefaultSkipAsyncInMemoryMergeEngine.cs | 2 +- .../FirstSkipAsyncInMemoryMergeEngine.cs | 37 +++------ 6 files changed, 234 insertions(+), 30 deletions(-) create mode 100644 samples/Sample.MySql/Migrations/20220704042701_init.Designer.cs create mode 100644 samples/Sample.MySql/Migrations/20220704042701_init.cs create mode 100644 samples/Sample.MySql/Migrations/DefaultShardingDbContextModelSnapshot.cs diff --git a/samples/Sample.MySql/Migrations/20220704042701_init.Designer.cs b/samples/Sample.MySql/Migrations/20220704042701_init.Designer.cs new file mode 100644 index 00000000..6b3a7628 --- /dev/null +++ b/samples/Sample.MySql/Migrations/20220704042701_init.Designer.cs @@ -0,0 +1,76 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sample.MySql.DbContexts; + +#nullable disable + +namespace Sample.MySql.Migrations +{ + [DbContext(typeof(DefaultShardingDbContext))] + [Migration("20220704042701_init")] + partial class init + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysTest", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("UserId") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("SysTest", (string)null); + }); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysUserLogByMonth", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Time") + .HasColumnType("datetime"); + + b.HasKey("Id"); + + b.ToTable("SysUserLogByMonth", (string)null); + }); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysUserMod", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("SysUserMod", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/samples/Sample.MySql/Migrations/20220704042701_init.cs b/samples/Sample.MySql/Migrations/20220704042701_init.cs new file mode 100644 index 00000000..49ad62bb --- /dev/null +++ b/samples/Sample.MySql/Migrations/20220704042701_init.cs @@ -0,0 +1,73 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Sample.MySql.Migrations +{ + public partial class init : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SysTest", + columns: table => new + { + Id = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + UserId = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_SysTest", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SysUserLogByMonth", + columns: table => new + { + Id = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Time = table.Column(type: "datetime", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SysUserLogByMonth", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SysUserMod", + columns: table => new + { + Id = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Name = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Age = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SysUserMod", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SysTest"); + + migrationBuilder.DropTable( + name: "SysUserLogByMonth"); + + migrationBuilder.DropTable( + name: "SysUserMod"); + } + } +} diff --git a/samples/Sample.MySql/Migrations/DefaultShardingDbContextModelSnapshot.cs b/samples/Sample.MySql/Migrations/DefaultShardingDbContextModelSnapshot.cs new file mode 100644 index 00000000..172e3bc4 --- /dev/null +++ b/samples/Sample.MySql/Migrations/DefaultShardingDbContextModelSnapshot.cs @@ -0,0 +1,74 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sample.MySql.DbContexts; + +#nullable disable + +namespace Sample.MySql.Migrations +{ + [DbContext(typeof(DefaultShardingDbContext))] + partial class DefaultShardingDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysTest", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("UserId") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("SysTest", (string)null); + }); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysUserLogByMonth", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Time") + .HasColumnType("datetime"); + + b.HasKey("Id"); + + b.ToTable("SysUserLogByMonth", (string)null); + }); + + modelBuilder.Entity("Sample.MySql.Domain.Entities.SysUserMod", b => + { + b.Property("Id") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("SysUserMod", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/ShardingCore/Extensions/StreamMergeEnumerableExtension.cs b/src/ShardingCore/Extensions/StreamMergeEnumerableExtension.cs index 6925b695..b70ef2d6 100644 --- a/src/ShardingCore/Extensions/StreamMergeEnumerableExtension.cs +++ b/src/ShardingCore/Extensions/StreamMergeEnumerableExtension.cs @@ -10,7 +10,7 @@ namespace ShardingCore.Extensions public static async Task> ToStreamListAsync(this IAsyncEnumerable source, int? take=null,CancellationToken cancellationToken=default) { #if EFCORE2 - var list = await asyncEnumeratorStreamMergeEngine.ToList(cancellationToken); + var list = await source.ToList(cancellationToken); #endif #if !EFCORE2 var list = new List(take??4); diff --git a/src/ShardingCore/Sharding/MergeEngines/FirstOrDefaultSkipAsyncInMemoryMergeEngine.cs b/src/ShardingCore/Sharding/MergeEngines/FirstOrDefaultSkipAsyncInMemoryMergeEngine.cs index d7337871..a90f9a1f 100644 --- a/src/ShardingCore/Sharding/MergeEngines/FirstOrDefaultSkipAsyncInMemoryMergeEngine.cs +++ b/src/ShardingCore/Sharding/MergeEngines/FirstOrDefaultSkipAsyncInMemoryMergeEngine.cs @@ -46,7 +46,7 @@ namespace ShardingCore.Sharding.MergeEngines { //将toke改成1 var asyncEnumeratorStreamMergeEngine = new AsyncEnumeratorStreamMergeEngine(_streamMergeContext); - var list = asyncEnumeratorStreamMergeEngine.ToList(); + var list = asyncEnumeratorStreamMergeEngine.ToStreamList(); return GetFirstOrDefault(list); } diff --git a/src/ShardingCore/Sharding/MergeEngines/FirstSkipAsyncInMemoryMergeEngine.cs b/src/ShardingCore/Sharding/MergeEngines/FirstSkipAsyncInMemoryMergeEngine.cs index 7e8837a8..5ff99a96 100644 --- a/src/ShardingCore/Sharding/MergeEngines/FirstSkipAsyncInMemoryMergeEngine.cs +++ b/src/ShardingCore/Sharding/MergeEngines/FirstSkipAsyncInMemoryMergeEngine.cs @@ -41,21 +41,8 @@ namespace ShardingCore.Sharding.MergeEngines //将toke改成1 var asyncEnumeratorStreamMergeEngine = new AsyncEnumeratorStreamMergeEngine(_streamMergeContext); -#if EFCORE2 - var list = asyncEnumeratorStreamMergeEngine.ToList(); -#endif -#if !EFCORE2 - var take = _streamMergeContext.GetTake(); - var list = new List(take??4); - foreach (var element in asyncEnumeratorStreamMergeEngine) - { - list.Add(element); - } -#endif - if (list.IsEmpty()) - throw new InvalidOperationException("Sequence contains no elements."); - - return list.First(); + var list = asyncEnumeratorStreamMergeEngine.ToStreamList(); + return GetFirst(list); } public async Task MergeResultAsync(CancellationToken cancellationToken = new CancellationToken()) @@ -63,25 +50,19 @@ namespace ShardingCore.Sharding.MergeEngines //将toke改成1 var asyncEnumeratorStreamMergeEngine = new AsyncEnumeratorStreamMergeEngine(_streamMergeContext); - -#if EFCORE2 - var list = await asyncEnumeratorStreamMergeEngine.ToList(cancellationToken); -#endif -#if !EFCORE2 var take = _streamMergeContext.GetTake(); - var list = new List(take??4); - await foreach (var element in asyncEnumeratorStreamMergeEngine.WithCancellation(cancellationToken)) - { - list.Add(element); - } -#endif + var list =await asyncEnumeratorStreamMergeEngine.ToStreamListAsync(take,cancellationToken); + return GetFirst(list); + } + + private TEntity GetFirst(List list) + { if (list.IsEmpty()) throw new InvalidOperationException("Sequence contains no elements."); return list.First(); } - - + // if (notNullResult.IsEmpty()) // throw new InvalidOperationException("Sequence contains no elements."); //