From 03a94888a87b8ae4bbb7c7b0a11e230f497599b2 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 8 May 2020 10:38:39 +0800 Subject: [PATCH] - fix 1.5.0-preview0502 bug --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 ---------------- FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 5 ++++- FreeSql/Internal/CommonExpression.cs | 15 +++++++++------ .../Internal/CommonProvider/DeleteProvider.cs | 2 +- .../SelectProvider/Select1Provider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 2 +- .../FreeSql.Provider.Dameng/Curd/DamengSelect.cs | 2 +- .../Curd/MsAccessSelect.cs | 2 +- .../FreeSql.Provider.MySql/Curd/MySqlSelect.cs | 2 +- .../Dameng/Curd/OdbcDamengSelect.cs | 2 +- .../Default/Curd/OdbcSelect.cs | 2 +- .../MySql/Curd/OdbcMySqlSelect.cs | 2 +- .../Oracle/Curd/OdbcOracleSelect.cs | 2 +- .../PostgreSQL/Curd/OdbcPostgreSQLSelect.cs | 2 +- .../SqlServer/Curd/OdbcSqlServerSelect.cs | 4 ++-- .../FreeSql.Provider.Oracle/Curd/OracleSelect.cs | 2 +- .../Curd/PostgreSQLSelect.cs | 2 +- .../Curd/SqlServerSelect.cs | 4 ++-- .../FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs | 2 +- 19 files changed, 31 insertions(+), 41 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 4854f49c..132d875e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,13 +125,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 @@ -486,14 +479,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index 7f0d97fc..3d0d109b 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -281,17 +281,20 @@ namespace FreeSql.Tests g.sqlite.GlobalFilter.Apply("gft1", a => a.rowstate > -1 && g.sqlite.Select().Any(b => b.id == a.id)) .Apply("gft2", a => a.rowstate > -2) - .Apply("gft3", a => a.rowstate > -3); + .Apply("gft3", a => a.rowstate > -3) + .Apply("gft11", a => a.rowstate > -1); var tksk1 = g.sqlite.Select() .InnerJoin((a, b, c) => a.id == b.id) .Where((a, b, c) => c.rowstate > 10) .ToList(); + g.sqlite.Update().NoneParameter().Set(a => a.rowstate + 1).Where(a => a.rowstate >= 0).ExecuteAffrows(); var tksk2 = g.sqlite.Select() .InnerJoin((a, b, c) => a.id == b.id) .Where((a, b, c) => c.rowstate > 10) .ToList(); + g.sqlite.Update().NoneParameter().Set(a => a.rowstate + 1).Where(a => a.rowstate >= 0).ExecuteAffrows(); var dtot2 = g.sqlite.Select().ToList(a => new gfDto { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 8bb2196e..d328c134 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1433,8 +1433,8 @@ namespace FreeSql.Internal } } - static ConcurrentDictionary _dicGetWhereCascadeSqlError = new ConcurrentDictionary(); - public string GetWhereCascadeSql(SelectTableInfo tb, List _whereCascadeExpression) + static ConcurrentDictionary> _dicGetWhereCascadeSqlError = new ConcurrentDictionary>(); + public string GetWhereCascadeSql(SelectTableInfo tb, List _whereCascadeExpression, bool isMultitb) { if (_whereCascadeExpression.Any()) { @@ -1445,8 +1445,9 @@ namespace FreeSql.Internal foreach (var fl in _whereCascadeExpression) { - var errorKey = FreeUtil.Sha1($"{tb.Table.Type.FullName},{fl.ToString()}"); - if (_dicGetWhereCascadeSqlError.ContainsKey(errorKey)) continue; + var dicSqlError = _dicGetWhereCascadeSqlError.GetOrAdd(tb.Table.Type, tp => new ConcurrentDictionary()); + var errorKey = FreeUtil.Sha1($"{(isMultitb ? 1 : 0)},{fl.ToString()}"); + if (dicSqlError.ContainsKey(errorKey)) continue; var visitor = new ReplaceVisitor(); try @@ -1456,7 +1457,9 @@ namespace FreeSql.Internal new ReplaceVisitor().Modify(fl, newParameter), newParameter ); - var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = new List(new[] { tb }), _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias }); + var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = + isMultitb ? new List(new[] { tb }) : null, + _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias }); whereSql = GetBoolString(expExp.Body, whereSql); if (isEmpty == false) sb.Append(" AND "); @@ -1466,7 +1469,7 @@ namespace FreeSql.Internal } catch { - _dicGetWhereCascadeSqlError.TryAdd(errorKey, true); + dicSqlError.TryAdd(errorKey, true); continue; } } diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 516b75f0..f4179e1d 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -151,7 +151,7 @@ namespace FreeSql.Internal.CommonProvider if (_whereGlobalFilter.Any()) { - var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList()); + var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList(), false); if (string.IsNullOrEmpty(globalFilterCondi) == false) sb.Append(" AND ").Append(globalFilterCondi); } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index f75af392..c9bd0f50 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -830,7 +830,7 @@ namespace FreeSql.Internal.CommonProvider sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}"); if (_whereCascadeExpression.Any()) { - var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression); + var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression, true); if (string.IsNullOrEmpty(cascade) == false) sbJoin.Append(" AND (").Append(cascade).Append(")"); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index e3cdd898..4f85e510 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -726,7 +726,7 @@ namespace FreeSql.Internal.CommonProvider if (_whereGlobalFilter.Any()) { - var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList()); + var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList(), false); if (string.IsNullOrEmpty(globalFilterCondi) == false) sb.Append(" AND ").Append(globalFilterCondi); } diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs index e93a68f6..c9087dff 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Dameng.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs index dde8525e..b692561a 100644 --- a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs +++ b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs @@ -20,7 +20,7 @@ namespace FreeSql.MsAccess.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs index c29cc5e7..802bc791 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.MySql.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs index fdba488e..b876790a 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Odbc.Dameng if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs index 1611f4f7..7479b256 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Odbc.Default if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs index 13790134..078ec66f 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Odbc.MySql if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs index 6dafdef1..ccefb0f7 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Odbc.Oracle if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs index 0ef6c116..86d3e7de 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Odbc.PostgreSQL if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 09b2cd46..9a6d2cde 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -25,7 +25,7 @@ namespace FreeSql.Odbc.SqlServer if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -140,7 +140,7 @@ namespace FreeSql.Odbc.SqlServer if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs index f73aaaa5..7a725285 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Oracle.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs index 4485b2be..80b28769 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.PostgreSQL.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index 459f96f5..024bc957 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -25,7 +25,7 @@ namespace FreeSql.SqlServer.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -140,7 +140,7 @@ namespace FreeSql.SqlServer.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs index f2cf82db..bf2af50d 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs @@ -19,7 +19,7 @@ namespace FreeSql.Sqlite.Curd if (_whereCascadeExpression.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression, true); var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1;