update

2881099
2022-05-23 20:41:13 +08:00
parent 0c83b981d9
commit fbeae2d227
3 changed files with 95 additions and 23 deletions

@@ -182,7 +182,20 @@ fsql.Select<Category>().ToList(a => new {
});
```
## 9. Collection properties
## 9、Subtable: ToList
> v3.2.650+
```csharp
fsql.Select<Topic>().ToList(a => new
{
all = a,
list1 = fsql.Select<T2>().ToList(),
list2 = fsql.Select<T2>().Where(b => b.TopicId == a.Id).ToList()
});
```
## 10. Collection properties
```csharp
fsql.Select<Category>()
@@ -200,7 +213,7 @@ fsql.Select<Category>()
Quickly convert the collection properties to `ISelect` for sub-query operations.
## 10. WhereCascade
## 11. WhereCascade
When querying multiple tables, it is troublesome to add conditions to each table like `ISelect`, and `WhereCascade` came into being. After using `WhereCascade`, when SQL is generated, all tables will be attached to this condition.

@@ -172,7 +172,20 @@ fsql.Select<Category>().ToList(a => new {
});
```
## 9、集合属性
## 9、子表ToList
> v3.2.650+ 以下最多执行3次 SQL
```csharp
fsql.Select<Topic>().ToList(a => new
{
all = a,
list1 = fsql.Select<T2>().ToList(),
list2 = fsql.Select<T2>().Where(b => b.TopicId == a.Id).ToList()
});
```
## 10、集合属性
```csharp
fsql.Select<Category>()
@@ -190,7 +203,7 @@ fsql.Select<Category>()
将集合属性快速转换为 ISelect 进行子查询操作。
## 10、WhereCascade
## 11、WhereCascade
多表查询时像isdeleted每个表都给条件挺麻烦的。WhereCascade使用后生成sql时所有表都附上这个条件。

@@ -115,38 +115,84 @@ fsql.Select<T>()
```csharp
fsql.Select<T1, T2>()
.InnerJoin((a, b) => b.Id == a.Id)
.ToList((a, b) => new
{
Id = a.Id,
EdiId = b.Id,
over1 = SqlExt.Rank().Over().OrderBy(a.Id).OrderByDescending(b.EdiId).ToValue()
});
.InnerJoin((a, b) => b.Id == a.Id)
.ToList((a, b) => new
{
Id = a.Id,
EdiId = b.Id,
over1 = SqlExt.Rank().Over().OrderBy(a.Id).OrderByDescending(b.EdiId).ToValue()
});
```
> v1.6.0 利用自定义解析功能,增加 SqlExt.Rank().Over().PartitionBy(...)、MySql group_concat 常用函数,欢迎 PR 补充
## 返回子查询字段
## 子表Exists
```c#
fsql.Select<Topic>()
.Where(a => fsql.Select<Topic>().As("b").Where(b => b.Id == a.Id).Any())
.ToList();
//SELECT a.`Id`, a.`Title`, a.`Clicks`, a.`CreateTime`, a.`CategoryId`
//FROM `Topic` a
//WHERE (exists(SELECT 1
// FROM `Topic` b
// WHERE (b.`Id` = a.`Id`)
// limit 0,1))
```
> 提示:由于子查询的实体类与上层相同,使用 As("b") 指明别名,以便区分
## 子表In
```c#
fsql.Select<Topic>()
.Where(a => fsql.Select<Topic>().As("b").ToList(b => b.Id).Contains(a.Id))
.ToList();
//SELECT a.`Id`, a.`Title`, a.`Clicks`, a.`CreateTime`, a.`CategoryId`
//FROM `Topic` a
//WHERE (((a.`Id`) in (SELECT b.`Id`
// FROM `Topic` b)))
```
## 子表Join
> v1.8.0+ string.Join + ToList 实现将子查询的多行结果,拼接为一个字符串,如:"1,2,3,4"
```c#
fsql.Select<Topic>().ToList(a => new {
id = a.Id,
concat = string.Join(",", fsql.Select<StringJoin01>().ToList(b => b.Id))
});
//SELECT a.`Id`, (SELECT group_concat(b.`Id` separator ',')
// FROM `StringJoin01` b)
//FROM `Topic` a
```
> 提示:子查询 string.Join + ToList 适配了 sqlserver/pgsql/oracle/mysql/sqlite/firebird/达梦/金仓/南大/翰高 [#405](https://github.com/dotnetcore/FreeSql/issues/405)
## 子表First/Count/Sum/Max/Min/Avg
```csharp
List<匿名类> t10 = fsql.Select<Topic>().ToList(a => new {
a.Id,
count = fsql.Select<T2>().Count(),
max = fsql.Select<T2>().Max(b => b.Id),
min = fsql.Select<T2>().Min(b => b.Id),
name = fsql.Select<2>().First(b => b.name)
fsql.Select<Category>().ToList(a => new {
all = a,
first = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).First(b => b.Id),
count = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).Count(),
sum = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).Sum(b => b.Clicks),
max = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).Max(b => b.Clicks),
min = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).Min(b => b.Clicks),
avg = fsql.Select<Topic>().Where(b => b.CategoryId == a.Id).Avg(b => b.Clicks)
});
```
## 返回子查询集合
## 子表ToList
> v3.2.650+ 以下最多执行3次 SQL
```csharp
List<匿名类> t11 = fsql.Select<Topic>().ToList(a => new {
a.Id,
list1 = fsql.Select<T2>().ToList(),
list2 = fsql.Select<T2>().Where(b => b.TopicId == a.Id).ToList()
fsql.Select<Topic>().ToList(a => new
{
all = a,
list1 = fsql.Select<T2>().ToList(),
list2 = fsql.Select<T2>().Where(b => b.TopicId == a.Id).ToList()
});
```