From 173f75f0a66a105ba513535e3aa9727140f08b76 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 18 May 2022 10:45:29 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20RawJoin=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20FULL=20JOIN=20=E7=AD=89=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E8=81=94=E8=A1=A8=E6=98=A0=E5=B0=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 12 +++++++++++- .../CommonProvider/SelectProvider/Select0Provider.cs | 5 +++++ FreeSql/Internal/Model/SelectTableInfo.cs | 2 +- .../Curd/ClickHouseSelect.cs | 4 +++- .../FreeSql.Provider.Custom/Curd/CustomSelect.cs | 4 +++- .../FreeSql.Provider.Dameng/Curd/DamengSelect.cs | 4 +++- .../FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs | 4 +++- Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs | 4 +++- .../Curd/KingbaseESSelect.cs | 4 +++- .../FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs | 4 +++- Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs | 4 +++- .../Dameng/Curd/OdbcDamengSelect.cs | 4 +++- .../FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs | 4 +++- .../KingbaseES/Curd/OdbcKingbaseESSelect.cs | 4 +++- .../MySql/Curd/OdbcMySqlSelect.cs | 4 +++- .../Oracle/Curd/OdbcOracleSelect.cs | 4 +++- .../PostgreSQL/Curd/OdbcPostgreSQLSelect.cs | 4 +++- .../SqlServer/Curd/OdbcSqlServerSelect.cs | 8 ++++++-- .../FreeSql.Provider.Oracle/Curd/OracleSelect.cs | 4 +++- .../Curd/PostgreSQLSelect.cs | 4 +++- .../FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs | 4 +++- .../Curd/SqlServerSelect.cs | 8 ++++++-- .../FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs | 4 +++- 23 files changed, 83 insertions(+), 24 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index f03b8ed3..1dad165e 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -271,7 +271,7 @@ namespace base_entity if (CommandTimeoutCascade._asyncLocalTimeout.Value > 0) e.Command.CommandTimeout = CommandTimeoutCascade._asyncLocalTimeout.Value; }; - + using (new CommandTimeoutCascade(1000)) { fsql.Select().ToList(); @@ -280,6 +280,16 @@ namespace base_entity } + var sql1 = fsql.Select() + .RawJoin("FULL JOIN UserGroup b ON b.id = a.GroupId") + .Where((a, b) => a.IsDeleted == false) + .ToSql((a, b) => new + { + user = a, group = b + }); + sql1 = sql1.Replace("INNER JOIN ", "FULL JOIN "); + + fsql.UseJsonMap(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 3652ca52..2df311fc 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -302,6 +302,11 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(sql)) return this as TSelect; _join.Append(" \r\n").Append(sql); + + //fsql.Select().RawJoin("FULL JOIN UserGroup b ON b.id = a.GroupId").ToSql((a, b) => new { user = a, group = b }); + foreach (var tb in _tables) + if (sql.Contains($" {tb.Table.DbName} ") || sql.Contains($" {_commonUtils.QuoteSqlName(tb.Table.DbName)} ")) + tb.Type = SelectTableInfoType.RawJoin; return this as TSelect; } diff --git a/FreeSql/Internal/Model/SelectTableInfo.cs b/FreeSql/Internal/Model/SelectTableInfo.cs index 346181dc..f288a583 100644 --- a/FreeSql/Internal/Model/SelectTableInfo.cs +++ b/FreeSql/Internal/Model/SelectTableInfo.cs @@ -24,5 +24,5 @@ namespace FreeSql.Internal.Model public string Cascade { get; set; } } - public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } + public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, RawJoin, Parent } } diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs index 0f018e6a..e3eef147 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.ClickHouse.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs index 41b9f7ca..dea03470 100644 --- a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs +++ b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Custom } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs index 8ef3743b..29d769ab 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs @@ -71,9 +71,11 @@ namespace FreeSql.Dameng.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sbunion.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs index a31791d0..e1358a4a 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Firebird.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs index daf5a217..11740f7e 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.GBase.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs index 927a26cd..a54248f2 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.KingbaseES } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs index 9abd47c1..bea29f94 100644 --- a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs +++ b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs @@ -78,9 +78,11 @@ namespace FreeSql.MsAccess.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: if (ioinCounter++ > 0) sb.Insert(fromIndex, "(").Append(") "); sb.Append(" \r\nLEFT JOIN "); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs index eb5177a0..8c2f0c0b 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.MySql.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs index 6121afa3..7066b98b 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs @@ -71,9 +71,11 @@ namespace FreeSql.Odbc.Dameng } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sbunion.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs index cb35af9b..292c933c 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Odbc.Default } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs index dece7c0a..0a3afbb3 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.KingbaseES } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs index de181810..115dc0e6 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.MySql } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs index 3a43cc49..54dd773c 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs @@ -71,9 +71,11 @@ namespace FreeSql.Odbc.Oracle } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sbunion.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs index 79677e82..14abbee6 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.PostgreSQL } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 45c87130..eca1e5b7 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -90,9 +90,11 @@ namespace FreeSql.Odbc.SqlServer } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; @@ -195,9 +197,11 @@ namespace FreeSql.Odbc.SqlServer } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs index 9c2621af..636d961b 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs @@ -71,9 +71,11 @@ namespace FreeSql.Oracle.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sbunion.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs index 76df4935..aece7ca7 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.PostgreSQL.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs index 36fbaca0..70772de1 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.ShenTong.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index bd1592b3..c045b3ec 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -90,9 +90,11 @@ namespace FreeSql.SqlServer.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; @@ -195,9 +197,11 @@ namespace FreeSql.SqlServer.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs index 30843855..9d597515 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Sqlite.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break;