Skip to content

Commit 4b9c4e7

Browse files
committed
- 增加 UnionALL 联合查询;#1106 #1104 #668 #478 #432 #213 #138
1 parent d154a46 commit 4b9c4e7

File tree

9 files changed

+341
-221
lines changed

9 files changed

+341
-221
lines changed

Examples/base_entity/Program.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System;
99
using System.Collections.Concurrent;
1010
using System.Collections.Generic;
11+
using System.Data.Common;
1112
using System.Data.Odbc;
1213
using System.Data.SqlClient;
1314
using System.Data.SQLite;
@@ -388,6 +389,45 @@ static void Main(string[] args)
388389
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
389390
#endregion
390391

392+
var dbpars = new List<DbParameter>();
393+
394+
var a1id1 = Guid.NewGuid();
395+
var a1id2 = Guid.NewGuid();
396+
//fsql.CodeFirst.IsGenerateCommandParameterWithLambda = true;
397+
var sql1a0 = fsql.Select<User1>()
398+
.WithParameters(dbpars)
399+
.Where(a => a.Id == a1id1)
400+
401+
.UnionAll(
402+
fsql.Select<User1>()
403+
.WithParameters(dbpars)
404+
.Where(a => a.Id == a1id2)
405+
)
406+
.Where(a => a.Id == a1id1 || a.Id == a1id2)
407+
.ToSql();
408+
var sql1a1 = fsql.Select<User1>()
409+
.Where(a => a.Id == a1id1)
410+
.UnionAll(
411+
fsql.Select<User1>()
412+
.Where(a => a.Id == a1id2)
413+
)
414+
.Where(a => a.Id == a1id1 || a.Id == a1id2)
415+
.ToSql();
416+
var sql1a2 = fsql.Select<User1, UserGroup>()
417+
.InnerJoin((a,b)=> a.GroupId == b.Id)
418+
.Where((a, b) => a.Id == a1id1)
419+
.WithTempQuery((a, b) => new { user = a, group = b }) //匿名类型
420+
421+
.UnionAll(
422+
fsql.Select<User1, UserGroup>()
423+
.InnerJoin((a, b) => a.GroupId == b.Id)
424+
.Where((a, b) => a.Id == a1id2)
425+
.WithTempQuery((a, b) => new { user = a, group = b }) //匿名类型
426+
)
427+
428+
.Where(a => a.user.Id == a1id1 || a.user.Id == a1id2)
429+
.ToSql();
430+
391431

392432
var ddlsql01 = fsql.CodeFirst.GetComparisonDDLStatements<StringNulable>();
393433

FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,77 @@ public void SingleTablePartitionBy()
434434
Assert.Equal(list01[2].item.Nickname, "name03");
435435

436436

437+
var sql0111 = fsql.Select<SingleTablePartitionBy_User>()
438+
.WithTempQuery(a => new
439+
{
440+
item = a,
441+
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
442+
})
443+
.Where(a => a.rownum == 1)
444+
.UnionAll(
445+
fsql.Select<SingleTablePartitionBy_User>()
446+
.WithTempQuery(a => new
447+
{
448+
item = a,
449+
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderByDescending(a.Id).ToValue()
450+
})
451+
.Where(a => a.rownum == 2)
452+
)
453+
.Where(a => a.rownum == 1 || a.rownum == 2)
454+
.ToSql();
455+
var assertSql0111 = @"SELECT *
456+
FROM ( SELECT *
457+
FROM (
458+
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
459+
FROM [SingleTablePartitionBy_User] a ) a
460+
WHERE (a.[rownum] = 1)
461+
UNION ALL
462+
SELECT *
463+
FROM (
464+
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id] desc) [rownum]
465+
FROM [SingleTablePartitionBy_User] a ) a
466+
WHERE (a.[rownum] = 2) ) a
467+
WHERE ((a.[rownum] = 1 OR a.[rownum] = 2))";
468+
Assert.Equal(assertSql0111, sql0111);
469+
470+
var sel0111 = fsql.Select<SingleTablePartitionBy_User>()
471+
.WithTempQuery(a => new
472+
{
473+
item = a,
474+
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
475+
})
476+
.Where(a => a.rownum == 1)
477+
.UnionAll(
478+
fsql.Select<SingleTablePartitionBy_User>()
479+
.WithTempQuery(a => new
480+
{
481+
item = a,
482+
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderByDescending(a.Id).ToValue()
483+
})
484+
.Where(a => a.rownum == 2)
485+
)
486+
.Where(a => a.rownum == 1 || a.rownum == 2);
487+
Assert.Equal(assertSql0111, sel0111.ToSql());
488+
489+
var list0111 = sel0111.ToList();
490+
Assert.Equal(5, list0111.Count);
491+
Assert.Equal(list0111[0].rownum, 1);
492+
Assert.Equal(list0111[0].item.Id, 1);
493+
Assert.Equal(list0111[0].item.Nickname, "name01");
494+
Assert.Equal(list0111[1].rownum, 1);
495+
Assert.Equal(list0111[1].item.Id, 4);
496+
Assert.Equal(list0111[1].item.Nickname, "name02");
497+
Assert.Equal(list0111[2].rownum, 1);
498+
Assert.Equal(list0111[2].item.Id, 5);
499+
Assert.Equal(list0111[2].item.Nickname, "name03");
500+
Assert.Equal(list0111[3].rownum, 2);
501+
Assert.Equal(list0111[3].item.Id, 2);
502+
Assert.Equal(list0111[3].item.Nickname, "name01");
503+
Assert.Equal(list0111[4].rownum, 2);
504+
Assert.Equal(list0111[4].item.Id, 5);
505+
Assert.Equal(list0111[4].item.Nickname, "name03");
506+
507+
437508
var sql011 = fsql.Select<SingleTablePartitionBy_User>()
438509
.GroupBy(a => a.Nickname)
439510
.WithTempQuery(g => new { min = g.Min(g.Value.Id) })

FreeSql.Tests/FreeSql.Tests/UnitTest3.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public void Test03()
263263

264264
var ddlsql = g.sqlite.CodeFirst.GetComparisonDDLStatements(typeof(testInsertNullable), "tb123123");
265265
Assert.Equal(@"CREATE TABLE IF NOT EXISTS ""main"".""tb123123"" (
266-
""Id"" INTEGER PRIMARY KEY AUTOINCREMENT,
266+
""Id"" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
267267
""str1"" NVARCHAR(255) NOT NULL,
268268
""int1"" INTEGER NOT NULL,
269269
""int2"" INTEGER ,

0 commit comments

Comments
 (0)