From 43d966cc902fb507b34452b0eedeeac6b38954bd Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 27 Apr 2019 15:59:03 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E6=95=B0=E6=8D=AE=E5=BA=93=20bool=20?= =?UTF-8?q?=E7=9A=84=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySql/MySqlExpression/OtherTest.cs | 14 ++++++++++ .../Oracle/OracleExpression/OtherTest.cs | 14 ++++++++++ .../PostgreSQLExpression/OtherTest.cs | 14 ++++++++++ .../SqlServerExpression/OtherTest.cs | 25 +++++++++++++---- .../Sqlite/SqliteExpression/OtherTest.cs | 24 ++++++++++++---- FreeSql/FreeSql.csproj | 2 +- FreeSql/Internal/CommonExpression.cs | 28 ++++++++++++++++++- 7 files changed, 109 insertions(+), 12 deletions(-) diff --git a/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs b/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs index bee6336f..f8907726 100644 --- a/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs +++ b/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs @@ -14,6 +14,20 @@ namespace FreeSql.Tests.MySqlExpression { } + [Fact] + public void Boolean() { + var t1 = select.Where(a => a.testFieldBool == true).ToList(); + var t2 = select.Where(a => a.testFieldBool != true).ToList(); + 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 t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); + var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); + var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList(); + var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList(); + var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList(); + } [Fact] public void Array() { diff --git a/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs b/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs index 67acf44b..60af2b04 100644 --- a/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs +++ b/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs @@ -12,6 +12,20 @@ namespace FreeSql.Tests.OracleExpression { public OtherTest() { } + [Fact] + public void Boolean() { + var t1 = select.Where(a => a.Bool == true).ToList(); + var t2 = select.Where(a => a.Bool != true).ToList(); + 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 t11 = select.Where(a => a.BoolNullable == true).ToList(); + var t22 = select.Where(a => a.BoolNullable != true).ToList(); + var t33 = select.Where(a => a.BoolNullable == false).ToList(); + var t44 = select.Where(a => !a.BoolNullable.Value).ToList(); + var t55 = select.Where(a => a.BoolNullable.Value).ToList(); + } [Fact] public void Array() { diff --git a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index e4ed5aea..766d478b 100644 --- a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -20,6 +20,20 @@ namespace FreeSql.Tests.PostgreSQLExpression { NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis(); } + [Fact] + public void Boolean() { + var t1 = select.Where(a => a.testFieldBool == true).ToList(); + var t2 = select.Where(a => a.testFieldBool != true).ToList(); + 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 t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); + var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); + var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList(); + var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList(); + var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList(); + } [Fact] public void Array() { diff --git a/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs b/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs index 2bad405c..9e480695 100644 --- a/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs +++ b/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs @@ -18,6 +18,21 @@ namespace FreeSql.Tests.SqlServerExpression { ISelect select => _sqlserverFixture.SqlServer.Select(); + [Fact] + public void Boolean() { + var t1 = select.Where(a => a.testFieldBool == true).ToList(); + var t2 = select.Where(a => a.testFieldBool != true).ToList(); + 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 t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); + var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); + var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList(); + var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList(); + var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList(); + } + [Fact] public void Array() { IEnumerable testlinqlist = new List(new[] { 1, 2, 3 }); @@ -25,26 +40,26 @@ namespace FreeSql.Tests.SqlServerExpression { //in not in var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); - //var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); + var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); var sql113 = select.Where(a => !new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); var inarray = new[] { 1, 2, 3 }; var sql1111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); - //var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); + var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); //in not in var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); - //var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); + var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); - //var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList(); + var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList(); var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); var inarray2 = new List() { 1, 2, 3 }; var sql111111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); - //var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); + var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); } diff --git a/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs b/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs index 2d962bbd..60985b66 100644 --- a/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs +++ b/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs @@ -12,6 +12,20 @@ namespace FreeSql.Tests.SqliteExpression { public OtherTest() { } + [Fact] + public void Boolean() { + var t1 = select.Where(a => a.Bool == true).ToList(); + var t2 = select.Where(a => a.Bool != true).ToList(); + 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 t11 = select.Where(a => a.BoolNullable == true).ToList(); + var t22 = select.Where(a => a.BoolNullable != true).ToList(); + var t33 = select.Where(a => a.BoolNullable == false).ToList(); + var t44 = select.Where(a => !a.BoolNullable.Value).ToList(); + var t55 = select.Where(a => a.BoolNullable.Value).ToList(); + } [Fact] public void Array() { @@ -20,26 +34,26 @@ namespace FreeSql.Tests.SqliteExpression { //in not in var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList(); - //var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList(); + var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList(); var sql113 = select.Where(a => !new[] { 1, 2, 3 }.Contains(a.Int)).ToList(); var inarray = new[] { 1, 2, 3 }; var sql1111 = select.Where(a => inarray.Contains(a.Int)).ToList(); - //var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); + var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.Int)).ToList(); //in not in var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); - //var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int) == false).ToList(); + var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int) == false).ToList(); var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); - //var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList(); + var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList(); var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); var inarray2 = new List() { 1, 2, 3 }; var sql111111 = select.Where(a => inarray.Contains(a.Int)).ToList(); - //var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); + var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); var sql113333 = select.Where(a => !inarray.Contains(a.Int)).ToList(); } diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 21967f88..9a34bc3e 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.5 + 0.5.6 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 5ad56bc4..b4ff8006 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -278,6 +278,8 @@ namespace FreeSql.Internal { }; internal string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table }); + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) + return $"{sql} = {formatSql(true, null)}"; switch (sql) { case "1": case "'t'": return "1=1"; @@ -289,6 +291,8 @@ namespace FreeSql.Internal { internal string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) + return $"{sql} = {formatSql(true, null)}"; switch (sql) { case "1": case "'t'": return "1=1"; @@ -300,6 +304,8 @@ namespace FreeSql.Internal { internal void ExpressionJoinLambda(List _tables, SelectTableInfoType tbtype, Expression exp, Func getSelectGroupingMapString) { var tbidx = _tables.Count; var filter = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) + filter = $"{filter} = {formatSql(true, null)}"; switch (filter) { case "1": case "'t'": filter = "1=1"; break; @@ -354,6 +360,23 @@ namespace FreeSql.Internal { } } } + if (leftExp.Type.NullableTypeOrThis() == typeof(bool) && (leftExp.NodeType != ExpressionType.MemberAccess && rightExp.NodeType != ExpressionType.MemberAccess)) { + if (oper == "=") { + var trueVal = formatSql(true, null); + var falseVal = formatSql(false, null); + if (left == trueVal) return right; + else if (left == falseVal) return $"not({right})"; + else if (right == trueVal) return left; + else if (right == falseVal) return $"not({left})"; + } else if (oper == "<>") { + var trueVal = formatSql(true, null); + var falseVal = formatSql(false, null); + if (left == trueVal) return $"not({right})"; + else if (left == falseVal) return right; + else if (right == trueVal) return $"not({left})"; + else if (right == falseVal) return left; + } + } if (left == "NULL") { var tmp = right; @@ -374,7 +397,10 @@ namespace FreeSql.Internal { if (string.IsNullOrEmpty(args.Result) == false) return args.Result; } switch (exp.NodeType) { - case ExpressionType.Not: return $"not({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc)})"; + case ExpressionType.Not: + var notExp = (exp as UnaryExpression)?.Operand; + if (notExp.NodeType == ExpressionType.MemberAccess) return $"{ExpressionLambdaToSql(notExp, tsc)} = {formatSql(false, null)}"; + return $"not({ExpressionLambdaToSql(notExp, tsc)})"; case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc); case ExpressionType.TypeAs: