update

2881099
2022-04-30 11:03:31 +08:00
parent 2707f7ad5b
commit 0255fe7df9
2 changed files with 108 additions and 109 deletions

@@ -36,21 +36,21 @@ Different query results:
```csharp ```csharp
DataTable dt1 = _fsql.Select<object>() DataTable dt1 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToDataTable("ID,Age"); .ToDataTable("ID,Age");
``` ```
```sql ```sql
SELECT ID,Age SELECT ID,Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### Return to DataTable with all columns ### Return to DataTable with all columns
```csharp ```csharp
DataTable dt2 = _fsql.Select<object>() DataTable dt2 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToDataTable("*"); .ToDataTable("*");
``` ```
```sql ```sql
SELECT * SELECT *
@@ -62,25 +62,25 @@ FROM ( select * from TestClass ) a
```csharp ```csharp
List<(string,string)> list1 = _fsql List<(string,string)> list1 = _fsql
.Select<object>() .Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToList<(string, string)>("ID,Age"); .ToList<(string, string)>("ID,Age");
``` ```
```sql ```sql
SELECT ID, Age SELECT ID, Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### Return List\<object\> ### Return List\<object\>
```csharp ```csharp
var list2 = _fsql.Select<object>() var list2 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToList<object>("*"); .ToList<object>("*");
``` ```
```sql ```sql
SELECT * SELECT *
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### Return List\<object\> and support paging ### Return List\<object\> and support paging
@@ -88,16 +88,16 @@ SELECT *
```csharp ```csharp
var list3 = _fsql.Select<object>() var list3 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.WhereIf(true, "1=1") .WhereIf(true, "1=1")
.Page(1, 10).OrderBy("ID DESC") .Page(1, 10).OrderBy("ID DESC")
.ToList<object>("ID,Age"); .ToList<object>("ID,Age");
``` ```
```sql ```sql
SELECT ID, Age SELECT ID, Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
WHERE(1 = 1) WHERE(1 = 1)
ORDER BY ID DESC ORDER BY ID DESC
limit 0,10 limit 0,10
``` ```
### Return List\<TestClassDto\> and support paging ### Return List\<TestClassDto\> and support paging
@@ -105,18 +105,18 @@ SELECT ID, Age
```csharp ```csharp
var list4 = _fsql.Select<object>() var list4 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.WhereIf(true, "1=1") .WhereIf(true, "1=1")
.Page(1, 10) .Page(1, 10)
.OrderBy("ID DESC") .OrderBy("ID DESC")
.ToList<TestClssDto>("ID,Age,BIRTH_DAY as Birthday"); .ToList<TestClssDto>("ID,Age,BIRTH_DAY as Birthday");
``` ```
```sql ```sql
SELECT ID, Age,BIRTH_DAY as Birthday SELECT ID, Age,BIRTH_DAY as Birthday
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
WHERE(1 = 1) WHERE(1 = 1)
ORDER BY ID DESC ORDER BY ID DESC
limit 0,10 limit 0,10
``` ```
@@ -183,14 +183,11 @@ fsql.Ado.CommandFluent($"{sql1} UNION ALL {sql2}")
.ExecuteDataTable(); .ExecuteDataTable();
``` ```
## Paging Problem ## Paging Problem
After using `UNION ALL`, there will be a problem if you paginate directly. Please see the specific example: After using `UNION ALL`, there will be a problem if you paginate directly. Please see the specific example:
There is a problem with using WithSql + Page multiple times: There is a paging statement in each WithSql
### There is a problem with using WithSql + Page multiple times: There is a paging statement in each WithSql
```csharp ```csharp
var sql1 = fsql.Select<Topic>() var sql1 = fsql.Select<Topic>()
@@ -205,18 +202,18 @@ fsql.Select<Topic>().WithSql(sql1).WithSql(sql2).Page(1, 20).ToList();
```sql ```sql
SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a FROM `tb_topic` a
WHERE ((a.`Title`) LIKE '%xxx%') ) a WHERE ((a.`Title`) LIKE '%xxx%') ) a
limit 0,20) ftb limit 0,20) ftb
UNION ALL UNION ALL
SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a FROM `tb_topic` a
WHERE ((a.`Title`) LIKE '%yyy%') ) a WHERE ((a.`Title`) LIKE '%yyy%') ) a
limit 0,20) ftb limit 0,20) ftb
``` ```
@@ -232,30 +229,30 @@ Call WithSql multiple times. If you need to paging, you need to follow the two s
```csharp ```csharp
var sql = fsql.Select<Topic>() var sql = fsql.Select<Topic>()
.WithSql("SELECT * FROM tb_topic where id > 11") .WithSql("SELECT * FROM tb_topic where id > 11")
.WithSql("SELECT * FROM tb_topic where id < 10") .WithSql("SELECT * FROM tb_topic where id < 10")
.ToSql("*") .ToSql("*")
``` ```
The above code will be generated as a Sql statement using `UNION ALL`: The above code will be generated as a Sql statement using `UNION ALL`:
```sql ```sql
SELECT * from (SELECT * SELECT * from (SELECT *
FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftb FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftb
UNION ALL UNION ALL
SELECT * from (SELECT * SELECT * from (SELECT *
FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb
``` ```
- Step 2: on the basis of the SQL statement containing `UNION ALL`, page by calling the `Page` method: - Step 2: on the basis of the SQL statement containing `UNION ALL`, page by calling the `Page` method:
```csharp ```csharp
var sql2 = g.mysql.Select<Topic>() var sql2 = g.mysql.Select<Topic>()
.WithSql(sql) .WithSql(sql)
.Page(2, 10) .Page(2, 10)
.ToSql(); .ToSql();
``` ```
```sql ```sql
SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`

@@ -40,21 +40,21 @@
```csharp ```csharp
DataTable dt1 = _fsql.Select<object>() DataTable dt1 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToDataTable("ID,Age"); .ToDataTable("ID,Age");
``` ```
```sql ```sql
SELECT ID,Age SELECT ID,Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### 2.返回DataTable ### 2.返回DataTable
```csharp ```csharp
DataTable dt2 = _fsql.Select<object>() DataTable dt2 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToDataTable("*"); .ToDataTable("*");
``` ```
```sql ```sql
SELECT * SELECT *
@@ -66,25 +66,25 @@ FROM ( select * from TestClass ) a
```csharp ```csharp
List<(string,string)> list1 = _fsql List<(string,string)> list1 = _fsql
.Select<object>() .Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToList<(string, string)>("ID,Age"); .ToList<(string, string)>("ID,Age");
``` ```
```sql ```sql
SELECT ID, Age SELECT ID, Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### 4.返回`List<object>` ### 4.返回`List<object>`
```csharp ```csharp
var list2 = _fsql.Select<object>() var list2 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.ToList<object>("*"); .ToList<object>("*");
``` ```
```sql ```sql
SELECT * SELECT *
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
``` ```
### 5.返回`List<object>` 且能支持分页 ### 5.返回`List<object>` 且能支持分页
@@ -92,16 +92,16 @@ SELECT *
```csharp ```csharp
var list3 = _fsql.Select<object>() var list3 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.WhereIf(true, "1=1") .WhereIf(true, "1=1")
.Page(1, 10).OrderBy("ID DESC") .Page(1, 10).OrderBy("ID DESC")
.ToList<object>("ID,Age"); .ToList<object>("ID,Age");
``` ```
```sql ```sql
SELECT ID, Age SELECT ID, Age
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
WHERE(1 = 1) WHERE(1 = 1)
ORDER BY ID DESC ORDER BY ID DESC
limit 0,10 limit 0,10
``` ```
### 6.返回`List<TestClassDto>`且能支持分页 ### 6.返回`List<TestClassDto>`且能支持分页
@@ -109,18 +109,18 @@ SELECT ID, Age
```csharp ```csharp
var list4 = _fsql.Select<object>() var list4 = _fsql.Select<object>()
.WithSql("select * from TestClass ") .WithSql("select * from TestClass ")
.WhereIf(true, "1=1") .WhereIf(true, "1=1")
.Page(1, 10) .Page(1, 10)
.OrderBy("ID DESC") .OrderBy("ID DESC")
.ToList<TestClssDto>("ID,Age,BIRTH_DAY as Birthday"); .ToList<TestClssDto>("ID,Age,BIRTH_DAY as Birthday");
``` ```
```sql ```sql
SELECT ID,Age,BIRTH_DAY as Birthday SELECT ID,Age,BIRTH_DAY as Birthday
FROM(select * from TestClass ) a FROM(select * from TestClass ) a
WHERE(1 = 1) WHERE(1 = 1)
ORDER BY ID DESC ORDER BY ID DESC
limit 0,10 limit 0,10
``` ```
@@ -187,13 +187,12 @@ fsql.Ado.CommandFluent($"{sql1} UNION ALL {sql2}")
.ExecuteDataTable(); .ExecuteDataTable();
``` ```
## 分页问题 ## 分页问题
Union All 之后 如果直接 分页会有一个问题。请看具体示例 Union All 之后 如果直接 分页会有一个问题。请看具体示例
多次 WithSql + Page 存在问题每个WithSql内都有一个Page分页
### 多次WithSql+Page存在问题每个WithSql内都有一个Page分页
```csharp ```csharp
var sql1 = fsql.Select<Topic>() var sql1 = fsql.Select<Topic>()
.Where(a => a.Title.Contains("xxx")) .Where(a => a.Title.Contains("xxx"))
@@ -207,18 +206,18 @@ fsql.Select<Topic>().WithSql(sql1).WithSql(sql2).Page(1, 20).ToList();
```sql ```sql
SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a FROM `tb_topic` a
WHERE ((a.`Title`) LIKE '%xxx%') ) a WHERE ((a.`Title`) LIKE '%xxx%') ) a
limit 0,20) ftb limit 0,20) ftb
UNION ALL UNION ALL
SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a FROM `tb_topic` a
WHERE ((a.`Title`) LIKE '%yyy%') ) a WHERE ((a.`Title`) LIKE '%yyy%') ) a
limit 0,20) ftb limit 0,20) ftb
``` ```
@@ -226,39 +225,42 @@ limit 0,20) ftb
WithSql 可以和 AsTable 实现分表的功能。 WithSql 可以和 AsTable 实现分表的功能。
分表跨表查询的时候分页是要向每个子表即每个WithSql中的SQL分页都生效。 分表跨表查询的时候,分页是要向每个子表(即每个 WithSql 中的 SQL 分页)都生效。
## 解决方案 ## 解决方案
### 多次withsql如需分页需要按下面的二步操作 多次 withsql ,如需分页,需要按下面的二步操作
- 第一步通过witsql将二个sql组成一个sql。 - 第一步通过witsql将二个sql组成一个sql。
```csharp ```csharp
var sql = fsql.Select<Topic>() var sql = fsql.Select<Topic>()
.WithSql("SELECT * FROM tb_topic where id > 11") .WithSql("SELECT * FROM tb_topic where id > 11")
.WithSql("SELECT * FROM tb_topic where id < 10") .WithSql("SELECT * FROM tb_topic where id < 10")
.ToSql("*") .ToSql("*")
``` ```
如上生成的UOION ALLsql 如上生成的 UOION ALLsql
```sql ```sql
SELECT * from (SELECT * SELECT * from (SELECT *
FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftb FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftb
UNION ALL UNION ALL
SELECT * from (SELECT * SELECT * from (SELECT *
FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb
``` ```
- 第二步:之后 调用Page则是通过Union ALL后的结果上分页 - 第二步:之后 调用 Page 则是通过 Union ALL 后的结果上分页
```csharp ```csharp
var sql2 = g.mysql.Select<Topic>() var sql2 = g.mysql.Select<Topic>()
.WithSql(sql) .WithSql(sql)
.Page(2, 10) .Page(2, 10)
.ToSql(); .ToSql();
``` ```
```sql ```sql
SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT * from (SELECT * FROM ( SELECT * from (SELECT *