Skip to content

Commit

Permalink
- 增加 UnionALL 联合查询;#1106 #1104 #668 #478 #432 #213 #138
Browse files Browse the repository at this point in the history
  • Loading branch information
2881099 committed Aug 26, 2022
1 parent d154a46 commit 4b9c4e7
Show file tree
Hide file tree
Showing 9 changed files with 341 additions and 221 deletions.
40 changes: 40 additions & 0 deletions Examples/base_entity/Program.cs
Expand Up @@ -8,6 +8,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.SQLite;
Expand Down Expand Up @@ -388,6 +389,45 @@ static void Main(string[] args)
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
#endregion

var dbpars = new List<DbParameter>();

var a1id1 = Guid.NewGuid();
var a1id2 = Guid.NewGuid();
//fsql.CodeFirst.IsGenerateCommandParameterWithLambda = true;
var sql1a0 = fsql.Select<User1>()
.WithParameters(dbpars)
.Where(a => a.Id == a1id1)

.UnionAll(
fsql.Select<User1>()
.WithParameters(dbpars)
.Where(a => a.Id == a1id2)
)
.Where(a => a.Id == a1id1 || a.Id == a1id2)
.ToSql();
var sql1a1 = fsql.Select<User1>()
.Where(a => a.Id == a1id1)
.UnionAll(
fsql.Select<User1>()
.Where(a => a.Id == a1id2)
)
.Where(a => a.Id == a1id1 || a.Id == a1id2)
.ToSql();
var sql1a2 = fsql.Select<User1, UserGroup>()
.InnerJoin((a,b)=> a.GroupId == b.Id)
.Where((a, b) => a.Id == a1id1)
.WithTempQuery((a, b) => new { user = a, group = b }) //匿名类型

.UnionAll(
fsql.Select<User1, UserGroup>()
.InnerJoin((a, b) => a.GroupId == b.Id)
.Where((a, b) => a.Id == a1id2)
.WithTempQuery((a, b) => new { user = a, group = b }) //匿名类型
)

.Where(a => a.user.Id == a1id1 || a.user.Id == a1id2)
.ToSql();


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

Expand Down
Expand Up @@ -434,6 +434,77 @@ public void SingleTablePartitionBy()
Assert.Equal(list01[2].item.Nickname, "name03");


var sql0111 = fsql.Select<SingleTablePartitionBy_User>()
.WithTempQuery(a => new
{
item = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
})
.Where(a => a.rownum == 1)
.UnionAll(
fsql.Select<SingleTablePartitionBy_User>()
.WithTempQuery(a => new
{
item = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderByDescending(a.Id).ToValue()
})
.Where(a => a.rownum == 2)
)
.Where(a => a.rownum == 1 || a.rownum == 2)
.ToSql();
var assertSql0111 = @"SELECT *
FROM ( SELECT *
FROM (
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
FROM [SingleTablePartitionBy_User] a ) a
WHERE (a.[rownum] = 1)
UNION ALL
SELECT *
FROM (
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id] desc) [rownum]
FROM [SingleTablePartitionBy_User] a ) a
WHERE (a.[rownum] = 2) ) a
WHERE ((a.[rownum] = 1 OR a.[rownum] = 2))";
Assert.Equal(assertSql0111, sql0111);

var sel0111 = fsql.Select<SingleTablePartitionBy_User>()
.WithTempQuery(a => new
{
item = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
})
.Where(a => a.rownum == 1)
.UnionAll(
fsql.Select<SingleTablePartitionBy_User>()
.WithTempQuery(a => new
{
item = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderByDescending(a.Id).ToValue()
})
.Where(a => a.rownum == 2)
)
.Where(a => a.rownum == 1 || a.rownum == 2);
Assert.Equal(assertSql0111, sel0111.ToSql());

var list0111 = sel0111.ToList();
Assert.Equal(5, list0111.Count);
Assert.Equal(list0111[0].rownum, 1);
Assert.Equal(list0111[0].item.Id, 1);
Assert.Equal(list0111[0].item.Nickname, "name01");
Assert.Equal(list0111[1].rownum, 1);
Assert.Equal(list0111[1].item.Id, 4);
Assert.Equal(list0111[1].item.Nickname, "name02");
Assert.Equal(list0111[2].rownum, 1);
Assert.Equal(list0111[2].item.Id, 5);
Assert.Equal(list0111[2].item.Nickname, "name03");
Assert.Equal(list0111[3].rownum, 2);
Assert.Equal(list0111[3].item.Id, 2);
Assert.Equal(list0111[3].item.Nickname, "name01");
Assert.Equal(list0111[4].rownum, 2);
Assert.Equal(list0111[4].item.Id, 5);
Assert.Equal(list0111[4].item.Nickname, "name03");


var sql011 = fsql.Select<SingleTablePartitionBy_User>()
.GroupBy(a => a.Nickname)
.WithTempQuery(g => new { min = g.Min(g.Value.Id) })
Expand Down
2 changes: 1 addition & 1 deletion FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
Expand Up @@ -263,7 +263,7 @@ public void Test03()

var ddlsql = g.sqlite.CodeFirst.GetComparisonDDLStatements(typeof(testInsertNullable), "tb123123");
Assert.Equal(@"CREATE TABLE IF NOT EXISTS ""main"".""tb123123"" (
""Id"" INTEGER PRIMARY KEY AUTOINCREMENT,
""Id"" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
""str1"" NVARCHAR(255) NOT NULL,
""int1"" INTEGER NOT NULL,
""int2"" INTEGER ,
Expand Down

0 comments on commit 4b9c4e7

Please sign in to comment.