Skip to content

Commit 838dd83

Browse files
2881028810
authored andcommitted
- 增加 ISelect.AsTreeCte() 递归查询树表(向下或向下);
1 parent 4cde2a3 commit 838dd83

File tree

17 files changed

+368
-72
lines changed

17 files changed

+368
-72
lines changed

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,7 @@ public void ToTreeList()
17541754
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17551755
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17561756

1757-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList();
1757+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
17581758
Assert.Single(t3);
17591759
Assert.Equal("100000", t3[0].Code);
17601760
Assert.Single(t3[0].Childs);
@@ -1763,18 +1763,42 @@ public void ToTreeList()
17631763
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17641764
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17651765

1766-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList();
1766+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
17671767
Assert.Equal(4, t3.Count);
17681768
Assert.Equal("100000", t3[0].Code);
17691769
Assert.Equal("110000", t3[1].Code);
17701770
Assert.Equal("110100", t3[2].Code);
17711771
Assert.Equal("110101", t3[3].Code);
17721772

1773-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList();
1773+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
17741774
Assert.Equal(3, t3.Count);
17751775
Assert.Equal("110000", t3[0].Code);
17761776
Assert.Equal("110100", t3[1].Code);
17771777
Assert.Equal("110101", t3[2].Code);
1778+
1779+
var t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name).OrderBy(a => a.Code)
1780+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1781+
Assert.Equal(4, t4.Count);
1782+
Assert.Equal("100000", t4[0].item.Code);
1783+
Assert.Equal("110000", t4[1].item.Code);
1784+
Assert.Equal("110100", t4[2].item.Code);
1785+
Assert.Equal("110101", t4[3].item.Code);
1786+
Assert.Equal("中国", t4[0].path);
1787+
Assert.Equal("中国 -> 北京", t4[1].path);
1788+
Assert.Equal("中国 -> 北京 -> 北京市", t4[2].path);
1789+
Assert.Equal("中国 -> 北京 -> 东城区", t4[3].path);
1790+
1791+
t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code)
1792+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1793+
Assert.Equal(4, t4.Count);
1794+
Assert.Equal("100000", t4[0].item.Code);
1795+
Assert.Equal("110000", t4[1].item.Code);
1796+
Assert.Equal("110100", t4[2].item.Code);
1797+
Assert.Equal("110101", t4[3].item.Code);
1798+
Assert.Equal("中国[100000]", t4[0].path);
1799+
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
1800+
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
1801+
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
17781802
}
17791803

17801804
[Table(Name = "D_District")]

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ public void WhereIn()
889889
var subquery = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
890890
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
891891
FROM ""TB_TOPIC22"" a
892-
WHERE ((((a.""ID"")::varchar) in (SELECT b.""TITLE""
892+
WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
893893
FROM ""TB_TOPIC22"" b)))", subquery);
894894
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
895895
}
@@ -1719,7 +1719,7 @@ public void ToTreeList()
17191719
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17201720
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17211721

1722-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList();
1722+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
17231723
Assert.Single(t3);
17241724
Assert.Equal("100000", t3[0].Code);
17251725
Assert.Single(t3[0].Childs);
@@ -1728,18 +1728,42 @@ public void ToTreeList()
17281728
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17291729
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17301730

1731-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList();
1731+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
17321732
Assert.Equal(4, t3.Count);
17331733
Assert.Equal("100000", t3[0].Code);
17341734
Assert.Equal("110000", t3[1].Code);
17351735
Assert.Equal("110100", t3[2].Code);
17361736
Assert.Equal("110101", t3[3].Code);
17371737

1738-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList();
1738+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
17391739
Assert.Equal(3, t3.Count);
17401740
Assert.Equal("110000", t3[0].Code);
17411741
Assert.Equal("110100", t3[1].Code);
17421742
Assert.Equal("110101", t3[2].Code);
1743+
1744+
var t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name).OrderBy(a => a.Code)
1745+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1746+
Assert.Equal(4, t4.Count);
1747+
Assert.Equal("100000", t4[0].item.Code);
1748+
Assert.Equal("110000", t4[1].item.Code);
1749+
Assert.Equal("110100", t4[2].item.Code);
1750+
Assert.Equal("110101", t4[3].item.Code);
1751+
Assert.Equal("中国", t4[0].path);
1752+
Assert.Equal("中国 -> 北京", t4[1].path);
1753+
Assert.Equal("中国 -> 北京 -> 北京市", t4[2].path);
1754+
Assert.Equal("中国 -> 北京 -> 东城区", t4[3].path);
1755+
1756+
t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code)
1757+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1758+
Assert.Equal(4, t4.Count);
1759+
Assert.Equal("100000", t4[0].item.Code);
1760+
Assert.Equal("110000", t4[1].item.Code);
1761+
Assert.Equal("110100", t4[2].item.Code);
1762+
Assert.Equal("110101", t4[3].item.Code);
1763+
Assert.Equal("中国[100000]", t4[0].path);
1764+
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
1765+
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
1766+
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
17431767
}
17441768

17451769
[Table(Name = "D_District")]

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,7 +1755,7 @@ public void ToTreeList()
17551755
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17561756
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17571757

1758-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList();
1758+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
17591759
Assert.Single(t3);
17601760
Assert.Equal("100000", t3[0].Code);
17611761
Assert.Single(t3[0].Childs);
@@ -1764,18 +1764,42 @@ public void ToTreeList()
17641764
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17651765
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17661766

1767-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList();
1767+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
17681768
Assert.Equal(4, t3.Count);
17691769
Assert.Equal("100000", t3[0].Code);
17701770
Assert.Equal("110000", t3[1].Code);
17711771
Assert.Equal("110100", t3[2].Code);
17721772
Assert.Equal("110101", t3[3].Code);
17731773

1774-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList();
1774+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
17751775
Assert.Equal(3, t3.Count);
17761776
Assert.Equal("110000", t3[0].Code);
17771777
Assert.Equal("110100", t3[1].Code);
17781778
Assert.Equal("110101", t3[2].Code);
1779+
1780+
var t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name).OrderBy(a => a.Code)
1781+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1782+
Assert.Equal(4, t4.Count);
1783+
Assert.Equal("100000", t4[0].item.Code);
1784+
Assert.Equal("110000", t4[1].item.Code);
1785+
Assert.Equal("110100", t4[2].item.Code);
1786+
Assert.Equal("110101", t4[3].item.Code);
1787+
Assert.Equal("中国", t4[0].path);
1788+
Assert.Equal("中国 -> 北京", t4[1].path);
1789+
Assert.Equal("中国 -> 北京 -> 北京市", t4[2].path);
1790+
Assert.Equal("中国 -> 北京 -> 东城区", t4[3].path);
1791+
1792+
t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code)
1793+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1794+
Assert.Equal(4, t4.Count);
1795+
Assert.Equal("100000", t4[0].item.Code);
1796+
Assert.Equal("110000", t4[1].item.Code);
1797+
Assert.Equal("110100", t4[2].item.Code);
1798+
Assert.Equal("110101", t4[3].item.Code);
1799+
Assert.Equal("中国[100000]", t4[0].path);
1800+
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
1801+
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
1802+
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
17791803
}
17801804

17811805
[Table(Name = "D_District")]

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@ public void WhereIn()
985985
var subquery = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
986986
Assert.Equal(@"SELECT a.""id"", a.""clicks"", a.""typeguid"", a.""title"", a.""createtime""
987987
FROM ""tb_topic"" a
988-
WHERE ((((a.""id"")::varchar) in (SELECT b.""title""
988+
WHERE ((((a.""id"")::text) in (SELECT b.""title""
989989
FROM ""tb_topic"" b)))", subquery);
990990
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
991991
}
@@ -1814,7 +1814,7 @@ public void ToTreeList()
18141814
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
18151815
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
18161816

1817-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList();
1817+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
18181818
Assert.Single(t3);
18191819
Assert.Equal("100000", t3[0].Code);
18201820
Assert.Single(t3[0].Childs);
@@ -1823,18 +1823,42 @@ public void ToTreeList()
18231823
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
18241824
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
18251825

1826-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList();
1826+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
18271827
Assert.Equal(4, t3.Count);
18281828
Assert.Equal("100000", t3[0].Code);
18291829
Assert.Equal("110000", t3[1].Code);
18301830
Assert.Equal("110100", t3[2].Code);
18311831
Assert.Equal("110101", t3[3].Code);
18321832

1833-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList();
1833+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
18341834
Assert.Equal(3, t3.Count);
18351835
Assert.Equal("110000", t3[0].Code);
18361836
Assert.Equal("110100", t3[1].Code);
18371837
Assert.Equal("110101", t3[2].Code);
1838+
1839+
var t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name).OrderBy(a => a.Code)
1840+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1841+
Assert.Equal(4, t4.Count);
1842+
Assert.Equal("100000", t4[0].item.Code);
1843+
Assert.Equal("110000", t4[1].item.Code);
1844+
Assert.Equal("110100", t4[2].item.Code);
1845+
Assert.Equal("110101", t4[3].item.Code);
1846+
Assert.Equal("中国", t4[0].path);
1847+
Assert.Equal("中国 -> 北京", t4[1].path);
1848+
Assert.Equal("中国 -> 北京 -> 北京市", t4[2].path);
1849+
Assert.Equal("中国 -> 北京 -> 东城区", t4[3].path);
1850+
1851+
t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code)
1852+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1853+
Assert.Equal(4, t4.Count);
1854+
Assert.Equal("100000", t4[0].item.Code);
1855+
Assert.Equal("110000", t4[1].item.Code);
1856+
Assert.Equal("110100", t4[2].item.Code);
1857+
Assert.Equal("110101", t4[3].item.Code);
1858+
Assert.Equal("中国[100000]", t4[0].path);
1859+
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
1860+
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
1861+
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
18381862
}
18391863

18401864
[Table(Name = "D_District")]

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,7 +1705,7 @@ public void ToTreeList()
17051705
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17061706
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17071707

1708-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList();
1708+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
17091709
Assert.Single(t3);
17101710
Assert.Equal("100000", t3[0].Code);
17111711
Assert.Single(t3[0].Childs);
@@ -1714,18 +1714,42 @@ public void ToTreeList()
17141714
Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code);
17151715
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
17161716

1717-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList();
1717+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
17181718
Assert.Equal(4, t3.Count);
17191719
Assert.Equal("100000", t3[0].Code);
17201720
Assert.Equal("110000", t3[1].Code);
17211721
Assert.Equal("110100", t3[2].Code);
17221722
Assert.Equal("110101", t3[3].Code);
17231723

1724-
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList();
1724+
t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
17251725
Assert.Equal(3, t3.Count);
17261726
Assert.Equal("110000", t3[0].Code);
17271727
Assert.Equal("110100", t3[1].Code);
17281728
Assert.Equal("110101", t3[2].Code);
1729+
1730+
var t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name).OrderBy(a => a.Code)
1731+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1732+
Assert.Equal(4, t4.Count);
1733+
Assert.Equal("100000", t4[0].item.Code);
1734+
Assert.Equal("110000", t4[1].item.Code);
1735+
Assert.Equal("110100", t4[2].item.Code);
1736+
Assert.Equal("110101", t4[3].item.Code);
1737+
Assert.Equal("中国", t4[0].path);
1738+
Assert.Equal("中国 -> 北京", t4[1].path);
1739+
Assert.Equal("中国 -> 北京 -> 北京市", t4[2].path);
1740+
Assert.Equal("中国 -> 北京 -> 东城区", t4[3].path);
1741+
1742+
t4 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code)
1743+
.ToList(a => new { item = a, level = Convert.ToInt32("a.cte_level"), path = "a.cte_path" });
1744+
Assert.Equal(4, t4.Count);
1745+
Assert.Equal("100000", t4[0].item.Code);
1746+
Assert.Equal("110000", t4[1].item.Code);
1747+
Assert.Equal("110100", t4[2].item.Code);
1748+
Assert.Equal("110101", t4[3].item.Code);
1749+
Assert.Equal("中国[100000]", t4[0].path);
1750+
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
1751+
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
1752+
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
17291753
}
17301754

17311755
[Table(Name = "D_District")]

0 commit comments

Comments
 (0)