diff --git a/FreeSql.Tests.VB/UnitTest1.vb b/FreeSql.Tests.VB/UnitTest1.vb index 7c8a5f14..2a233711 100644 --- a/FreeSql.Tests.VB/UnitTest1.vb +++ b/FreeSql.Tests.VB/UnitTest1.vb @@ -13,6 +13,8 @@ Namespace FreeSql.Tests.VB Dim List4 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a, a.Id, a.Title}) + Dim List5 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IsDeleted).ToList() + End Sub End Class End Namespace @@ -20,4 +22,5 @@ End Namespace Class Testvb Property Id As Integer Property Title As String + Property IsDeleted As Boolean End Class diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/OtherTest.cs index 19ab9e10..f882ed1a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorExpression/OtherTest.cs @@ -41,6 +41,7 @@ namespace FreeSql.Tests.MySqlConnectorExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengExpression/OtherTest.cs index 5129514b..c5cdb567 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengExpression/OtherTest.cs @@ -39,6 +39,7 @@ namespace FreeSql.Tests.Odbc.DamengExpression var t3 = select.Where(a => a.Bool == false).ToList(); var t4 = select.Where(a => !a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList(); + var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/OdbcExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/OdbcExpression/OtherTest.cs index cf22c6f2..b7cd5c7b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/OdbcExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/OdbcExpression/OtherTest.cs @@ -35,6 +35,7 @@ namespace FreeSql.Tests.Odbc.DefaultExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/OtherTest.cs index 3c31f047..c3c442d1 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlExpression/OtherTest.cs @@ -41,6 +41,7 @@ namespace FreeSql.Tests.Odbc.MySqlExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleExpression/OtherTest.cs index dcc2eccf..7be7f8f5 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleExpression/OtherTest.cs @@ -39,6 +39,7 @@ namespace FreeSql.Tests.Odbc.OracleExpression var t3 = select.Where(a => a.Bool == false).ToList(); var t4 = select.Where(a => !a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList(); + var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLExpression/OtherTest.cs index f0062476..a418e8ac 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -44,6 +44,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQLExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/OtherTest.cs index 7d0167f1..bb965b84 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerExpression/OtherTest.cs @@ -36,6 +36,7 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs index d926eed7..2ab152e1 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs @@ -41,6 +41,7 @@ namespace FreeSql.Tests.MySqlExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs index d8317ef1..e1b0a61c 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs @@ -39,6 +39,7 @@ namespace FreeSql.Tests.OracleExpression var t3 = select.Where(a => a.Bool == false).ToList(); var t4 = select.Where(a => !a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList(); + var t51 = select.WhereCascade(a => a.Bool).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index 4ba7feea..034c1ae3 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -48,6 +48,7 @@ namespace FreeSql.Tests.PostgreSQLExpression var t3 = select.Where(a => a.testFieldBool == false).Limit(10).ToList(); var t4 = select.Where(a => !a.testFieldBool).Limit(10).ToList(); var t5 = select.Where(a => a.testFieldBool).Limit(10).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).Limit(10).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).Limit(10).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs index ce27dceb..70cfb014 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs @@ -44,6 +44,7 @@ namespace FreeSql.Tests.SqlServerExpression var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList(); + var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs index 51aa61f6..c40c4e42 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs @@ -39,6 +39,7 @@ namespace FreeSql.Tests.SqliteExpression var t3 = select.Where(a => a.Bool == false).ToList(); var t4 = select.Where(a => !a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList(); + var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList(); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 10af2539..f3cc5c5b 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -342,37 +342,24 @@ namespace FreeSql.Internal { ExpressionType.Modulo, "%" }, { ExpressionType.Equal, "=" }, }; + public string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString, List dbParams) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table, dbParams = dbParams }); - var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); - if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - return $"{sql} = {formatSql(true, null, null, null)}"; - if (isBool) - return GetBoolString(sql); - return sql; + return GetBoolString(exp, sql); } public string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString, List whereCascadeExpression, List dbParams) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression, dbParams = dbParams }); - var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); - if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - return $"{sql} = {formatSql(true, null, null, null)}"; - if (isBool) - return GetBoolString(sql); - return sql; + return GetBoolString(exp, sql); } static ConcurrentDictionary dicRegexAlias = new ConcurrentDictionary(); public void ExpressionJoinLambda(List _tables, SelectTableInfoType tbtype, Expression exp, Func getSelectGroupingMapString, List whereCascadeExpression) { var tbidx = _tables.Count; var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); - var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); - if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - sql = $"{sql} = {formatSql(true, null, null, null)}"; - if (isBool) - sql = GetBoolString(sql); + sql = GetBoolString(exp, sql); if (_tables.Count > tbidx) { @@ -404,6 +391,15 @@ namespace FreeSql.Internal static MethodInfo MethodDateTimeSubtractTimeSpan = typeof(DateTime).GetMethod("Subtract", new Type[] { typeof(TimeSpan) }); static MethodInfo MethodMathFloor = typeof(Math).GetMethod("Floor", new Type[] { typeof(double) }); + public string GetBoolString(Expression exp, string sql) + { + var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); + if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) + return $"{sql} = {formatSql(true, null, null, null)}"; + if (isBool) + return GetBoolString(sql); + return sql; + } static string GetBoolString(string sql) { switch (sql) @@ -1340,7 +1336,8 @@ namespace FreeSql.Internal new ReplaceVisitor().Modify(fl.Body, newParameter), newParameter ); - var whereSql = ExpressionLambdaToSql(expExp, new ExpTSC { _tables = null, _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 = 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 "); else