Skip to content

Commit b16218d

Browse files
2881028810
authored andcommitted
- 修复 Expression OrElse 两侧括号丢失的 bug;
- 修复 Expression DateTime 类型 CompareTo 在 MySql/SqlServer 下的 bug;
1 parent 9dd85f3 commit b16218d

File tree

11 files changed

+280
-16
lines changed

11 files changed

+280
-16
lines changed

Examples/benchmarker/Program.cs

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.ComponentModel.DataAnnotations;
4+
using System.ComponentModel.DataAnnotations.Schema;
5+
using System.Linq;
6+
using BenchmarkDotNet.Attributes;
7+
using BenchmarkDotNet.Running;
8+
using Microsoft.EntityFrameworkCore;
9+
//using SqlSugar;
10+
11+
namespace FreeSql.Bechmarker {
12+
13+
public class Program {
14+
public static void Main(string[] args) {
15+
var summaryInsert = BenchmarkRunner.Run<OrmVsInsert>();
16+
var summarySelect = BenchmarkRunner.Run<OrmVsSelect>();
17+
var summaryUpdate = BenchmarkRunner.Run<OrmVsUpdate>();
18+
}
19+
}
20+
21+
public class Orm {
22+
public static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
23+
.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20")
24+
//.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=20")
25+
.UseAutoSyncStructure(false)
26+
.UseNoneCommandParameter(true)
27+
//.UseConfigEntityFromDbFirst(true)
28+
.Build();
29+
30+
//public static SqlSugarClient sugar {
31+
// get => new SqlSugarClient(new ConnectionConfig() {
32+
// //不欺负,让连接池100个最小
33+
// ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20",
34+
// DbType = DbType.SqlServer,
35+
// //ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20",
36+
// //DbType = DbType.MySql,
37+
// IsAutoCloseConnection = true,
38+
// InitKeyType = InitKeyType.Attribute
39+
// });
40+
//}
41+
}
42+
class SongContext : DbContext {
43+
public DbSet<Song> Songs { get; set; }
44+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
45+
optionsBuilder.UseSqlServer(@"Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=21;Max Pool Size=21");
46+
//optionsBuilder.UseMySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=21;Max Pool Size=21");
47+
}
48+
}
49+
50+
[CoreJob]
51+
[RPlotExporter, RankColumn]
52+
public class OrmVsInsert {
53+
public IEnumerable<Song> songs;
54+
55+
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
56+
public int size;
57+
58+
[GlobalSetup]
59+
public void Setup() {
60+
Orm.fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag));
61+
//Orm.sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
62+
//sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements
63+
64+
//测试前清空数据
65+
Orm.fsql.Delete<Song>().Where(a => a.Id > 0).ExecuteAffrows();
66+
//Orm.sugar.Deleteable<Song>().Where(a => a.Id > 0).ExecuteCommand();
67+
Orm.fsql.Ado.ExecuteNonQuery("delete from efcore_song");
68+
69+
songs = Enumerable.Range(0, size).Select(a => new Song {
70+
Create_time = DateTime.Now,
71+
Is_deleted = false,
72+
Title = $"Insert_{a}",
73+
Url = $"Url_{a}"
74+
});
75+
76+
//预热
77+
Orm.fsql.Insert(songs.First()).ExecuteAffrows();
78+
//Orm.sugar.Insertable(songs.First()).ExecuteCommand();
79+
using (var db = new SongContext()) {
80+
//db.Configuration.AutoDetectChangesEnabled = false;
81+
db.Songs.AddRange(songs.First());
82+
db.SaveChanges();
83+
}
84+
}
85+
86+
[Benchmark]
87+
public int FreeSqlInsert() => Orm.fsql.Insert(songs).ExecuteAffrows();
88+
89+
//[Benchmark]
90+
//public int SqlSugarInsert() => Orm.sugar.Insertable(songs.ToArray()).ExecuteCommand();
91+
92+
[Benchmark]
93+
public int EfCoreInsert() {
94+
using (var db = new SongContext()) {
95+
//db.Configuration.AutoDetectChangesEnabled = false;
96+
db.Songs.AddRange(songs.ToArray());
97+
return db.SaveChanges();
98+
}
99+
}
100+
}
101+
102+
[CoreJob]
103+
[RPlotExporter, RankColumn]
104+
public class OrmVsUpdate {
105+
public List<Song> songs;
106+
107+
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
108+
public int size;
109+
110+
[GlobalSetup]
111+
public void Setup() {
112+
songs = Orm.fsql.Select<Song>().Limit(size).ToList();
113+
}
114+
115+
[Benchmark]
116+
public int FreeSqlUpdate() => Orm.fsql.Update<Song>().SetSource(songs).ExecuteAffrows();
117+
118+
//[Benchmark]
119+
//public int SqlSugarUpdate() => Orm.sugar.Updateable(songs).ExecuteCommand();
120+
121+
[Benchmark]
122+
public int EfCoreUpdate() {
123+
using (var db = new SongContext()) {
124+
//db.Configuration.AutoDetectChangesEnabled = false;
125+
db.Songs.UpdateRange(songs.ToArray());
126+
return db.SaveChanges();
127+
}
128+
}
129+
}
130+
131+
[CoreJob]
132+
[RPlotExporter, RankColumn]
133+
public class OrmVsSelect {
134+
135+
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
136+
public int size;
137+
138+
[GlobalSetup]
139+
public void Setup() {
140+
141+
}
142+
143+
[Benchmark]
144+
public List<Song> FreeSqlSelect() => Orm.fsql.Select<Song>().Limit(size).ToList();
145+
146+
//[Benchmark]
147+
//public List<Song> SqlSugarSelect() => Orm.sugar.Queryable<Song>().Take(size).ToList();
148+
149+
[Benchmark]
150+
public List<Song> EfCoreSelect() {
151+
using (var db = new SongContext()) {
152+
return db.Songs.Take(size).AsNoTracking().ToList();
153+
}
154+
}
155+
}
156+
157+
[FreeSql.DataAnnotations.Table(Name = "freesql_song")]
158+
//[SugarTable("sugar_song")]
159+
[Table("efcore_song")]
160+
public class Song {
161+
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
162+
//[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
163+
[Key]
164+
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
165+
public int Id { get; set; }
166+
public DateTime? Create_time { get; set; }
167+
public bool? Is_deleted { get; set; }
168+
public string Title { get; set; }
169+
public string Url { get; set; }
170+
171+
//[SugarColumn(IsIgnore = true)]
172+
[NotMapped]
173+
public virtual ICollection<Tag> Tags { get; set; }
174+
}
175+
[FreeSql.DataAnnotations.Table(Name = "freesql_song_tag")]
176+
//[SugarTable("sugar_song_tag")]
177+
[Table("efcore_song_tag")]
178+
public class Song_tag {
179+
public int Song_id { get; set; }
180+
//[SugarColumn(IsIgnore = true)]
181+
[NotMapped]
182+
public virtual Song Song { get; set; }
183+
184+
public int Tag_id { get; set; }
185+
//[SugarColumn(IsIgnore = true)]
186+
[NotMapped]
187+
public virtual Tag Tag { get; set; }
188+
}
189+
[FreeSql.DataAnnotations.Table(Name = "freesql_tag")]
190+
//[SugarTable("sugar_tag")]
191+
[Table("efcore_tag")]
192+
public class Tag {
193+
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
194+
//[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
195+
[Key]
196+
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
197+
public int Id { get; set; }
198+
public int? Parent_id { get; set; }
199+
//[SugarColumn(IsIgnore = true)]
200+
[NotMapped]
201+
public virtual Tag Parent { get; set; }
202+
203+
public decimal? Ddd { get; set; }
204+
public string Name { get; set; }
205+
206+
//[SugarColumn(IsIgnore = true)]
207+
[NotMapped]
208+
public virtual ICollection<Song> Songs { get; set; }
209+
//[SugarColumn(IsIgnore = true)]
210+
[NotMapped]
211+
public virtual ICollection<Tag> Tags { get; set; }
212+
}
213+
}
214+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp2.2</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<PackageReference Include="BenchmarkDotNet" Version="0.11.5" />
10+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.4" />
11+
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
16+
</ItemGroup>
17+
18+
</Project>

FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,10 @@ public void RightJoin() {
536536
}
537537
[Fact]
538538
public void Where() {
539+
540+
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
541+
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
542+
539543
//����е�������a.Type��a.Type.Parent ���ǵ�������
540544
var query = select.Where(a => a.Id == 10);
541545
var sql = query.ToSql().Replace("\r\n", "");
@@ -544,7 +548,7 @@ public void Where() {
544548

545549
query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
546550
sql = query.ToSql().Replace("\r\n", "");
547-
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100)", sql);
551+
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100))", sql);
548552
query.ToList();
549553

550554
query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
@@ -607,7 +611,7 @@ public void WhereIf() {
607611

608612
query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
609613
sql = query.ToSql().Replace("\r\n", "");
610-
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100)", sql);
614+
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100))", sql);
611615
query.ToList();
612616

613617
query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);

FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@ public void RightJoin() {
433433
}
434434
[Fact]
435435
public void Where() {
436+
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
437+
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
438+
436439
//����е�������a.Type��a.Type.Parent ���ǵ�������
437440
var query = select.Where(a => a.Id == 10);
438441
var sql = query.ToSql().Replace("\r\n", "");
@@ -441,7 +444,7 @@ public void Where() {
441444

442445
query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
443446
sql = query.ToSql().Replace("\r\n", "");
444-
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100)", sql);
447+
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql);
445448
query.ToList();
446449

447450
query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
@@ -504,7 +507,7 @@ public void WhereIf() {
504507

505508
query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
506509
sql = query.ToSql().Replace("\r\n", "");
507-
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100)", sql);
510+
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql);
508511
query.ToList();
509512

510513
query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);

FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,9 @@ public void RightJoin() {
504504
}
505505
[Fact]
506506
public void Where() {
507+
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
508+
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
509+
507510
//����е�������a.Type��a.Type.Parent ���ǵ�������
508511
var query = select.Where(a => a.Id == 10);
509512
var sql = query.ToSql().Replace("\r\n", "");
@@ -512,7 +515,7 @@ public void Where() {
512515

513516
query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
514517
sql = query.ToSql().Replace("\r\n", "");
515-
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE (a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100)", sql);
518+
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE ((a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100))", sql);
516519
query.ToList();
517520

518521
query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
@@ -575,7 +578,7 @@ public void WhereIf() {
575578

576579
query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
577580
sql = query.ToSql().Replace("\r\n", "");
578-
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE (a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100)", sql);
581+
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE ((a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100))", sql);
579582
query.ToList();
580583

581584
query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);

FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,9 @@ public void RightJoin() {
435435
}
436436
[Fact]
437437
public void Where() {
438+
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
439+
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
440+
438441
//����е�������a.Type��a.Type.Parent ���ǵ�������
439442
var query = select.Where(a => a.Id == 10);
440443
var sql = query.ToSql().Replace("\r\n", "");
@@ -443,7 +446,7 @@ public void Where() {
443446

444447
query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
445448
sql = query.ToSql().Replace("\r\n", "");
446-
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE (a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100)", sql);
449+
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE ((a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100))", sql);
447450
query.ToList();
448451

449452
query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
@@ -506,7 +509,7 @@ public void WhereIf() {
506509

507510
query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
508511
sql = query.ToSql().Replace("\r\n", "");
509-
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE (a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100)", sql);
512+
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE ((a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100))", sql);
510513
query.ToList();
511514

512515
query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);

FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ public void RightJoin() {
379379
}
380380
[Fact]
381381
public void Where() {
382+
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
383+
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
384+
382385
//����е�������a.Type��a.Type.Parent ���ǵ�������
383386
var query = select.Where(a => a.Id == 10);
384387
var sql = query.ToSql().Replace("\r\n", "");
@@ -387,7 +390,7 @@ public void Where() {
387390

388391
query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
389392
sql = query.ToSql().Replace("\r\n", "");
390-
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE (a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100)", sql);
393+
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE ((a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100))", sql);
391394
query.ToList();
392395

393396
query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
@@ -450,7 +453,7 @@ public void WhereIf() {
450453

451454
query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
452455
sql = query.ToSql().Replace("\r\n", "");
453-
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE (a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100)", sql);
456+
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE ((a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100))", sql);
454457
query.ToList();
455458

456459
query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);

0 commit comments

Comments
 (0)