diff --git a/Query-from-Multi-Tables.md b/Query-from-Multi-Tables.md index 3825a42..69d9398 100644 --- a/Query-from-Multi-Tables.md +++ b/Query-from-Multi-Tables.md @@ -182,7 +182,20 @@ fsql.Select().ToList(a => new { }); ``` -## 9. Collection properties +## 9、Subtable: ToList + +> v3.2.650+ + +```csharp +fsql.Select().ToList(a => new +{ + all = a, + list1 = fsql.Select().ToList(), + list2 = fsql.Select().Where(b => b.TopicId == a.Id).ToList() +}); +``` + +## 10. Collection properties ```csharp fsql.Select() @@ -200,7 +213,7 @@ fsql.Select() 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. diff --git a/多表查询.md b/多表查询.md index 57c9ea7..d76704e 100644 --- a/多表查询.md +++ b/多表查询.md @@ -172,7 +172,20 @@ fsql.Select().ToList(a => new { }); ``` -## 9、集合属性 +## 9、子表ToList + +> v3.2.650+ 以下最多执行3次 SQL + +```csharp +fsql.Select().ToList(a => new +{ + all = a, + list1 = fsql.Select().ToList(), + list2 = fsql.Select().Where(b => b.TopicId == a.Id).ToList() +}); +``` + +## 10、集合属性 ```csharp fsql.Select() @@ -190,7 +203,7 @@ fsql.Select() 将集合属性快速转换为 ISelect 进行子查询操作。 -## 10、WhereCascade +## 11、WhereCascade 多表查询时,像isdeleted每个表都给条件,挺麻烦的。WhereCascade使用后生成sql时,所有表都附上这个条件。 diff --git a/表达式函数.md b/表达式函数.md index 2ae4133..e8a559b 100644 --- a/表达式函数.md +++ b/表达式函数.md @@ -115,38 +115,84 @@ fsql.Select() ```csharp fsql.Select() -.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() + .Where(a => fsql.Select().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() + .Where(a => fsql.Select().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().ToList(a => new { + id = a.Id, + concat = string.Join(",", fsql.Select().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().ToList(a => new { - a.Id, - count = fsql.Select().Count(), - max = fsql.Select().Max(b => b.Id), - min = fsql.Select().Min(b => b.Id), - name = fsql.Select<2>().First(b => b.name) +fsql.Select().ToList(a => new { + all = a, + first = fsql.Select().Where(b => b.CategoryId == a.Id).First(b => b.Id), + count = fsql.Select().Where(b => b.CategoryId == a.Id).Count(), + sum = fsql.Select().Where(b => b.CategoryId == a.Id).Sum(b => b.Clicks), + max = fsql.Select().Where(b => b.CategoryId == a.Id).Max(b => b.Clicks), + min = fsql.Select().Where(b => b.CategoryId == a.Id).Min(b => b.Clicks), + avg = fsql.Select().Where(b => b.CategoryId == a.Id).Avg(b => b.Clicks) }); ``` -## 返回子查询集合 +## 子表ToList > v3.2.650+ 以下最多执行3次 SQL ```csharp -List<匿名类> t11 = fsql.Select().ToList(a => new { - a.Id, - list1 = fsql.Select().ToList(), - list2 = fsql.Select().Where(b => b.TopicId == a.Id).ToList() +fsql.Select().ToList(a => new +{ + all = a, + list1 = fsql.Select().ToList(), + list2 = fsql.Select().Where(b => b.TopicId == a.Id).ToList() }); ```