From ad12402926674d6b1e9c57db30d209c897ab1866 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Sun, 13 Sep 2020 10:45:14 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20ISelect<11..16>=2016?=
=?UTF-8?q?=20=E4=B8=AA=E5=A4=9A=E8=81=94=E8=A1=A8=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 14 +-
.../Firebird/Curd/FirebirdSelectTest.cs | 2 +-
FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 73 ++++
FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 45 +--
FreeSql/FreeSql.xml | 148 ---------
FreeSql/Interface/Curd/ISelect/ISelect1.cs | 91 +----
FreeSql/Interface/Curd/ISelect/ISelect11.cs | 64 ++++
FreeSql/Interface/Curd/ISelect/ISelect12.cs | 64 ++++
FreeSql/Interface/Curd/ISelect/ISelect13.cs | 64 ++++
FreeSql/Interface/Curd/ISelect/ISelect14.cs | 64 ++++
FreeSql/Interface/Curd/ISelect/ISelect15.cs | 64 ++++
FreeSql/Interface/Curd/ISelect/ISelect16.cs | 64 ++++
.../SelectProvider/Select11Provider.cs | 291 ++++++++++++++++
.../SelectProvider/Select12Provider.cs | 295 +++++++++++++++++
.../SelectProvider/Select13Provider.cs | 299 +++++++++++++++++
.../SelectProvider/Select14Provider.cs | 303 +++++++++++++++++
.../SelectProvider/Select15Provider.cs | 307 +++++++++++++++++
.../SelectProvider/Select16Provider.cs | 311 ++++++++++++++++++
.../SelectProvider/Select1Provider.cs | 7 +
FreeSql/Internal/Model/NativeTuple.cs | 205 ++++++++++++
.../Curd/DamengSelect.cs | 38 +++
.../Curd/FirebirdSelect.cs | 38 +++
.../FreeSql.Provider.Firebird.csproj | 4 +-
.../Curd/KingbaseESSelect.cs | 38 +++
.../Curd/MsAccessSelect.cs | 92 ++++--
.../Curd/MySqlSelect.cs | 38 +++
.../FreeSql.Provider.MySql.csproj | 2 +-
.../FreeSql.Provider.MySqlConnector.csproj | 2 +-
.../Dameng/Curd/OdbcDamengSelect.cs | 38 +++
.../Default/Curd/OdbcSelect.cs | 38 +++
.../FreeSql.Provider.Odbc.csproj | 2 +-
.../KingbaseES/Curd/OdbcKingbaseESSelect.cs | 38 +++
.../MySql/Curd/OdbcMySqlSelect.cs | 38 +++
.../Oracle/Curd/OdbcOracleSelect.cs | 38 +++
.../PostgreSQL/Curd/OdbcPostgreSQLSelect.cs | 38 +++
.../SqlServer/Curd/OdbcSqlServerSelect.cs | 38 +++
.../Curd/OracleSelect.cs | 38 +++
.../FreeSql.Provider.Oracle.csproj | 2 +-
.../Curd/PostgreSQLSelect.cs | 38 +++
.../FreeSql.Provider.PostgreSQL.csproj | 2 +-
.../Curd/ShenTongSelect.cs | 38 +++
.../Curd/SqlServerSelect.cs | 38 +++
.../FreeSql.Provider.SqlServer.csproj | 2 +-
...FreeSql.Provider.SqlServerForSystem.csproj | 2 +-
.../Curd/SqliteSelect.cs | 38 +++
45 files changed, 3188 insertions(+), 305 deletions(-)
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect11.cs
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect12.cs
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect13.cs
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect14.cs
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect15.cs
create mode 100644 FreeSql/Interface/Curd/ISelect/ISelect16.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select11Provider.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select12Provider.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select13Provider.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select14Provider.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select15Provider.cs
create mode 100644 FreeSql/Internal/CommonProvider/SelectProvider/Select16Provider.cs
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 743835e4..8cc83aba 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -329,10 +329,7 @@
- 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行
- 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】
- 示例:https://github.com/dotnetcore/FreeSql/issues/397
- 注意:* 本方法只支持单表操作,不支持导航属性级联保存
+ 开始编辑数据,然后调用方法 EndEdit 分析出添加方法只支持单表操作,不支持导航属性级联保存
@@ -532,6 +529,15 @@
+
+
+me="M:FreeSqlDbContextExtensions.CreateUnitOfWork(IFreeSql)">
+
+ 创建基于仓储功能的工作单元,务必使用 using 包含使用
+
+
+
+
批量注入 Repository,可以参考代码自行调整
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
index 33c14af4..bf5b6c9c 100644
--- a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
@@ -921,7 +921,7 @@ FROM ""TB_TOPIC22"" a", subquery);
var subquery = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
-WHERE (((cast(a.""ID"" as char)) in (SELECT b.""TITLE""
+WHERE (((cast(a.""ID"" as blob sub_type 1)) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
index 93056dd7..1f3ef8df 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
@@ -190,6 +190,79 @@ namespace FreeSql.Tests
;
", ddlsql);
+ var select16Sql1 = g.sqlite.Select()
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => b.userid == a.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => c.userid == b.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => d.userid == c.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => e.userid == d.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => f.userid == e.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => g.userid == f.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => h.userid == g.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => i.userid == h.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => j.userid == i.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => k.userid == j.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => l.userid == k.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => m.userid == l.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => n.userid == m.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => o.userid == n.userid)
+ .InnerJoin((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => p.userid == o.userid)
+ .ToSql((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => p);
+ Assert.Equal(@"SELECT p.""userid"" as1, p.""badgenumber"" as2, p.""ssn"" as3, p.""IDCardNo"" as4, p.""name"" as5, p.""title"" as6, p.""birthday"" as7, p.""hiredday"" as8, p.""hetongdate"" as9, p.""street"" as10, p.""zip"" as11, p.""ophone"" as12, p.""pager"" as13, p.""fphone"" as14, p.""CardNo"" as15, p.""email"" as16, p.""idcardvalidtime"" as17, p.""homeaddress"" as18, p.""minzu"" as19, p.""leavedate"" as20, p.""loginpass"" as21, p.""picurl"" as22, p.""managerid"" as23
+FROM ""userinfo"" a
+INNER JOIN ""userinfo"" b ON b.""userid"" = a.""userid""
+INNER JOIN ""userinfo"" c ON c.""userid"" = b.""userid""
+INNER JOIN ""userinfo"" d ON d.""userid"" = c.""userid""
+INNER JOIN ""userinfo"" e ON e.""userid"" = d.""userid""
+INNER JOIN ""userinfo"" f ON f.""userid"" = e.""userid""
+INNER JOIN ""userinfo"" g ON g.""userid"" = f.""userid""
+INNER JOIN ""userinfo"" h ON h.""userid"" = g.""userid""
+INNER JOIN ""userinfo"" i ON i.""userid"" = h.""userid""
+INNER JOIN ""userinfo"" j ON j.""userid"" = i.""userid""
+INNER JOIN ""userinfo"" k ON k.""userid"" = j.""userid""
+INNER JOIN ""userinfo"" l ON l.""userid"" = k.""userid""
+INNER JOIN ""userinfo"" m ON m.""userid"" = l.""userid""
+INNER JOIN ""userinfo"" n ON n.""userid"" = m.""userid""
+INNER JOIN ""userinfo"" o ON o.""userid"" = n.""userid""
+INNER JOIN ""userinfo"" p ON p.""userid"" = o.""userid""", select16Sql1);
+ var select16Sql2 = g.sqlite.Select()
+ .From(
+ (s, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => s
+ .InnerJoin(a => b.userid == a.userid)
+ .InnerJoin(a => c.userid == b.userid)
+ .InnerJoin(a => d.userid == c.userid)
+ .InnerJoin(a => e.userid == d.userid)
+ .InnerJoin(a => f.userid == e.userid)
+ .InnerJoin(a => g.userid == f.userid)
+ .InnerJoin(a => h.userid == g.userid)
+ .InnerJoin(a => i.userid == h.userid)
+ .InnerJoin(a => j.userid == i.userid)
+ .InnerJoin(a => k.userid == j.userid)
+ .InnerJoin(a => l.userid == k.userid)
+ .InnerJoin(a => m.userid == l.userid)
+ .InnerJoin(a => n.userid == m.userid)
+ .InnerJoin(a => o.userid == n.userid)
+ .InnerJoin(a => p.userid == o.userid)
+ )
+ .ToSql((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => p);
+ Assert.Equal(@"SELECT p.""userid"" as1, p.""badgenumber"" as2, p.""ssn"" as3, p.""IDCardNo"" as4, p.""name"" as5, p.""title"" as6, p.""birthday"" as7, p.""hiredday"" as8, p.""hetongdate"" as9, p.""street"" as10, p.""zip"" as11, p.""ophone"" as12, p.""pager"" as13, p.""fphone"" as14, p.""CardNo"" as15, p.""email"" as16, p.""idcardvalidtime"" as17, p.""homeaddress"" as18, p.""minzu"" as19, p.""leavedate"" as20, p.""loginpass"" as21, p.""picurl"" as22, p.""managerid"" as23
+FROM ""userinfo"" a
+INNER JOIN ""userinfo"" b ON b.""userid"" = a.""userid""
+INNER JOIN ""userinfo"" c ON c.""userid"" = b.""userid""
+INNER JOIN ""userinfo"" d ON d.""userid"" = c.""userid""
+INNER JOIN ""userinfo"" e ON e.""userid"" = d.""userid""
+INNER JOIN ""userinfo"" f ON f.""userid"" = e.""userid""
+INNER JOIN ""userinfo"" g ON g.""userid"" = f.""userid""
+INNER JOIN ""userinfo"" h ON h.""userid"" = g.""userid""
+INNER JOIN ""userinfo"" i ON i.""userid"" = h.""userid""
+INNER JOIN ""userinfo"" j ON j.""userid"" = i.""userid""
+INNER JOIN ""userinfo"" k ON k.""userid"" = j.""userid""
+INNER JOIN ""userinfo"" l ON l.""userid"" = k.""userid""
+INNER JOIN ""userinfo"" m ON m.""userid"" = l.""userid""
+INNER JOIN ""userinfo"" n ON n.""userid"" = m.""userid""
+INNER JOIN ""userinfo"" o ON o.""userid"" = n.""userid""
+INNER JOIN ""userinfo"" p ON p.""userid"" = o.""userid""", select16Sql2);
+
+
var sqlxx = g.pgsql.InsertOrUpdate().SetSource(new userinfo { userid = 10 }).UpdateColumns(a => new { a.birthday, a.CardNo }).ToSql();
var aff1 = g.sqlite.GetRepository().Delete(10086);
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
index 717db8f2..bc78db29 100644
--- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
@@ -239,54 +239,35 @@ public static partial class FreeSqlGlobalExtensions
///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class =>
freesql.Select().From((s, b) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class =>
freesql.Select().From((s, b, c) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class =>
freesql.Select().From((s, b, c, d) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class =>
freesql.Select().From((s, b, c, d, e) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class =>
freesql.Select().From((s, b, c, d, e, f) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class =>
freesql.Select().From((s, b, c, d, e, f, g) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class =>
freesql.Select().From((s, b, c, d, e, f, g, h) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class =>
freesql.Select().From((s, b, c, d, e, f, g, h, i) => s);
- ///
- /// 多表查询
- ///
- ///
public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class =>
freesql.Select().From((s, b, c, d, e, f, g, h, i, j) => s);
+
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k) => s);
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k, l) => s);
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k, l, m) => s);
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k, l, m, n) => s);
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k, l, m, n, o) => s);
+ public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class where T16 : class =>
+ freesql.Select().From((s, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) => s);
#endregion
#region IncludeMany
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index dbca2d52..8869f42b 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2106,106 +2106,6 @@
-
-
- 多表查询
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 多表查询
-
-
-
-
-
-
-
-
-
-
-
-
-
查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com")
@@ -4229,54 +4129,6 @@
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
-
-
- 多表查询
-
-
-
本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany 相同功能的贪婪加载
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs
index fd7a814c..b6cef93a 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs
@@ -165,98 +165,21 @@ namespace FreeSql
///
///
ISelect From(Expression, T2, ISelectFromExpression>> exp) where T2 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, ISelectFromExpression>> exp) where T2 : class where T3 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, T6, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, T6, T7, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class;
- ///
- /// 多表查询
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class;
+
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class;
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class;
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class;
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class;
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class;
+ ISelect From(Expression, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class where T16 : class;
///
/// 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com")
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect11.cs b/FreeSql/Interface/Curd/ISelect/ISelect11.cs
new file mode 100644
index 00000000..57e19df4
--- /dev/null
+++ b/FreeSql/Interface/Curd/ISelect/ISelect11.cs
@@ -0,0 +1,64 @@
+using FreeSql.Internal.Model;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+namespace FreeSql
+{
+ public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class
+ {
+
+#if net40
+#else
+ Task AnyAsync(Expression> exp);
+ Task ToDataTableAsync(Expression> select);
+ Task> ToListAsync(Expression> select);
+ Task> ToListAsync();
+
+ Task ToOneAsync(Expression> select);
+ Task FirstAsync(Expression> select);
+ Task FirstAsync();
+
+ Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ Task SumAsync(Expression> column);
+ Task MinAsync(Expression> column);
+ Task MaxAsync(Expression> column);
+ Task AvgAsync(Expression> column);
+#endif
+
+ bool Any(Expression> exp);
+ DataTable ToDataTable(Expression> select);
+ List ToList(Expression> select);
+ List ToList();
+ void ToChunk(Expression> select, int size, Action>> done);
+
+ TReturn ToOne(Expression> select);
+ TReturn First(Expression> select);
+ TDto First();
+
+ string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
+ TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
+ decimal Sum(Expression> column);
+ TMember Min(Expression> column);
+ TMember Max(Expression> column);
+ double Avg(Expression> column);
+
+ ISelect LeftJoin(Expression> exp);
+ ISelect InnerJoin(Expression> exp);
+ ISelect RightJoin(Expression> exp);
+
+ ISelect Where(Expression> exp);
+ ISelect WhereIf(bool condition, Expression> exp);
+
+ ISelectGrouping> GroupBy(Expression> exp);
+
+ ISelect OrderBy(Expression> column);
+ ISelect OrderByDescending(Expression> column);
+ ISelect OrderByIf(bool condition, Expression < Func> column, bool descending = false);
+
+ ISelect WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, object parms = null);
+ }
+}
\ No newline at end of file
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect12.cs b/FreeSql/Interface/Curd/ISelect/ISelect12.cs
new file mode 100644
index 00000000..05422fa9
--- /dev/null
+++ b/FreeSql/Interface/Curd/ISelect/ISelect12.cs
@@ -0,0 +1,64 @@
+using FreeSql.Internal.Model;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+namespace FreeSql
+{
+ public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class
+ {
+
+#if net40
+#else
+ Task AnyAsync(Expression> exp);
+ Task ToDataTableAsync(Expression> select);
+ Task> ToListAsync(Expression> select);
+ Task> ToListAsync();
+
+ Task ToOneAsync(Expression> select);
+ Task FirstAsync(Expression> select);
+ Task FirstAsync();
+
+ Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ Task SumAsync(Expression> column);
+ Task MinAsync(Expression> column);
+ Task MaxAsync(Expression> column);
+ Task AvgAsync(Expression> column);
+#endif
+
+ bool Any(Expression> exp);
+ DataTable ToDataTable(Expression> select);
+ List ToList(Expression> select);
+ List ToList();
+ void ToChunk(Expression> select, int size, Action>> done);
+
+ TReturn ToOne(Expression> select);
+ TReturn First(Expression> select);
+ TDto First();
+
+ string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
+ TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate