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.");
//