Skip to content

Commit 43d966c

Browse files
2881028810
authored andcommitted
- 优化 兼容不同数据库 bool 的表达式解析
1 parent 74a2cf5 commit 43d966c

File tree

7 files changed

+109
-12
lines changed

7 files changed

+109
-12
lines changed

FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,20 @@ public OtherTest() {
1414

1515
}
1616

17+
[Fact]
18+
public void Boolean() {
19+
var t1 = select.Where(a => a.testFieldBool == true).ToList();
20+
var t2 = select.Where(a => a.testFieldBool != true).ToList();
21+
var t3 = select.Where(a => a.testFieldBool == false).ToList();
22+
var t4 = select.Where(a => !a.testFieldBool).ToList();
23+
var t5 = select.Where(a => a.testFieldBool).ToList();
24+
25+
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
26+
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();
27+
var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList();
28+
var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList();
29+
var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList();
30+
}
1731

1832
[Fact]
1933
public void Array() {

FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ public class OtherTest {
1212
public OtherTest() {
1313
}
1414

15+
[Fact]
16+
public void Boolean() {
17+
var t1 = select.Where(a => a.Bool == true).ToList();
18+
var t2 = select.Where(a => a.Bool != true).ToList();
19+
var t3 = select.Where(a => a.Bool == false).ToList();
20+
var t4 = select.Where(a => !a.Bool).ToList();
21+
var t5 = select.Where(a => a.Bool).ToList();
22+
23+
var t11 = select.Where(a => a.BoolNullable == true).ToList();
24+
var t22 = select.Where(a => a.BoolNullable != true).ToList();
25+
var t33 = select.Where(a => a.BoolNullable == false).ToList();
26+
var t44 = select.Where(a => !a.BoolNullable.Value).ToList();
27+
var t55 = select.Where(a => a.BoolNullable.Value).ToList();
28+
}
1529

1630
[Fact]
1731
public void Array() {

FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ public OtherTest() {
2020
NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis();
2121
}
2222

23+
[Fact]
24+
public void Boolean() {
25+
var t1 = select.Where(a => a.testFieldBool == true).ToList();
26+
var t2 = select.Where(a => a.testFieldBool != true).ToList();
27+
var t3 = select.Where(a => a.testFieldBool == false).ToList();
28+
var t4 = select.Where(a => !a.testFieldBool).ToList();
29+
var t5 = select.Where(a => a.testFieldBool).ToList();
30+
31+
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
32+
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();
33+
var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList();
34+
var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList();
35+
var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList();
36+
}
2337

2438
[Fact]
2539
public void Array() {

FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,48 @@ public OtherTest(SqlServerFixture sqlserverFixture)
1818

1919
ISelect<TableAllType> select => _sqlserverFixture.SqlServer.Select<TableAllType>();
2020

21+
[Fact]
22+
public void Boolean() {
23+
var t1 = select.Where(a => a.testFieldBool == true).ToList();
24+
var t2 = select.Where(a => a.testFieldBool != true).ToList();
25+
var t3 = select.Where(a => a.testFieldBool == false).ToList();
26+
var t4 = select.Where(a => !a.testFieldBool).ToList();
27+
var t5 = select.Where(a => a.testFieldBool).ToList();
28+
29+
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
30+
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();
31+
var t33 = select.Where(a => a.testFieldBoolNullable == false).ToList();
32+
var t44 = select.Where(a => !a.testFieldBoolNullable.Value).ToList();
33+
var t55 = select.Where(a => a.testFieldBoolNullable.Value).ToList();
34+
}
35+
2136
[Fact]
2237
public void Array() {
2338
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
2439
var testlinq = select.Where(a => testlinqlist.Contains(a.testFieldInt)).ToList();
2540

2641
//in not in
2742
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
28-
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
43+
var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
2944
var sql113 = select.Where(a => !new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
3045

3146
var inarray = new[] { 1, 2, 3 };
3247
var sql1111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList();
33-
//var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList();
48+
var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList();
3449
var sql1133 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList();
3550

3651
//in not in
3752
var sql11111 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
38-
//var sql11222 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
53+
var sql11222 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
3954
var sql11333 = select.Where(a => !new List<int>() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
4055

4156
var sql11111a = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList();
42-
//var sql11222b = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList();
57+
var sql11222b = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList();
4358
var sql11333c = select.Where(a => !new List<int>(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList();
4459

4560
var inarray2 = new List<int>() { 1, 2, 3 };
4661
var sql111111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList();
47-
//var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList();
62+
var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList();
4863
var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList();
4964
}
5065

FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ public class OtherTest {
1212
public OtherTest() {
1313
}
1414

15+
[Fact]
16+
public void Boolean() {
17+
var t1 = select.Where(a => a.Bool == true).ToList();
18+
var t2 = select.Where(a => a.Bool != true).ToList();
19+
var t3 = select.Where(a => a.Bool == false).ToList();
20+
var t4 = select.Where(a => !a.Bool).ToList();
21+
var t5 = select.Where(a => a.Bool).ToList();
22+
23+
var t11 = select.Where(a => a.BoolNullable == true).ToList();
24+
var t22 = select.Where(a => a.BoolNullable != true).ToList();
25+
var t33 = select.Where(a => a.BoolNullable == false).ToList();
26+
var t44 = select.Where(a => !a.BoolNullable.Value).ToList();
27+
var t55 = select.Where(a => a.BoolNullable.Value).ToList();
28+
}
1529

1630
[Fact]
1731
public void Array() {
@@ -20,26 +34,26 @@ public void Array() {
2034

2135
//in not in
2236
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
23-
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
37+
var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
2438
var sql113 = select.Where(a => !new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
2539

2640
var inarray = new[] { 1, 2, 3 };
2741
var sql1111 = select.Where(a => inarray.Contains(a.Int)).ToList();
28-
//var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
42+
var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
2943
var sql1133 = select.Where(a => !inarray.Contains(a.Int)).ToList();
3044

3145
//in not in
3246
var sql11111 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.Int)).ToList();
33-
//var sql11222 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.Int) == false).ToList();
47+
var sql11222 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.Int) == false).ToList();
3448
var sql11333 = select.Where(a => !new List<int>() { 1, 2, 3 }.Contains(a.Int)).ToList();
3549

3650
var sql11111a = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.Int)).ToList();
37-
//var sql11222b = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList();
51+
var sql11222b = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList();
3852
var sql11333c = select.Where(a => !new List<int>(new[] { 1, 2, 3 }).Contains(a.Int)).ToList();
3953

4054
var inarray2 = new List<int>() { 1, 2, 3 };
4155
var sql111111 = select.Where(a => inarray.Contains(a.Int)).ToList();
42-
//var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
56+
var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
4357
var sql113333 = select.Where(a => !inarray.Contains(a.Int)).ToList();
4458
}
4559

FreeSql/FreeSql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<Version>0.5.5</Version>
5+
<Version>0.5.6</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

FreeSql/Internal/CommonExpression.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ internal string[] ExpressionSelectColumns_MemberAccess_New_NewArrayInit(List<Sel
278278
};
279279
internal string ExpressionWhereLambdaNoneForeignObject(List<SelectTableInfo> _tables, TableInfo table, List<SelectColumnInfo> _selectColumnMap, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
280280
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table });
281+
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool))
282+
return $"{sql} = {formatSql(true, null)}";
281283
switch (sql) {
282284
case "1":
283285
case "'t'": return "1=1";
@@ -289,6 +291,8 @@ internal string ExpressionWhereLambdaNoneForeignObject(List<SelectTableInfo> _ta
289291

290292
internal string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
291293
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where });
294+
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool))
295+
return $"{sql} = {formatSql(true, null)}";
292296
switch (sql) {
293297
case "1":
294298
case "'t'": return "1=1";
@@ -300,6 +304,8 @@ internal string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression
300304
internal void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
301305
var tbidx = _tables.Count;
302306
var filter = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where });
307+
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool))
308+
filter = $"{filter} = {formatSql(true, null)}";
303309
switch (filter) {
304310
case "1":
305311
case "'t'": filter = "1=1"; break;
@@ -354,6 +360,23 @@ internal string ExpressionBinary(string oper, Expression leftExp, Expression rig
354360
}
355361
}
356362
}
363+
if (leftExp.Type.NullableTypeOrThis() == typeof(bool) && (leftExp.NodeType != ExpressionType.MemberAccess && rightExp.NodeType != ExpressionType.MemberAccess)) {
364+
if (oper == "=") {
365+
var trueVal = formatSql(true, null);
366+
var falseVal = formatSql(false, null);
367+
if (left == trueVal) return right;
368+
else if (left == falseVal) return $"not({right})";
369+
else if (right == trueVal) return left;
370+
else if (right == falseVal) return $"not({left})";
371+
} else if (oper == "<>") {
372+
var trueVal = formatSql(true, null);
373+
var falseVal = formatSql(false, null);
374+
if (left == trueVal) return $"not({right})";
375+
else if (left == falseVal) return right;
376+
else if (right == trueVal) return $"not({left})";
377+
else if (right == falseVal) return left;
378+
}
379+
}
357380

358381
if (left == "NULL") {
359382
var tmp = right;
@@ -374,7 +397,10 @@ internal string ExpressionLambdaToSql(Expression exp, ExpTSC tsc) {
374397
if (string.IsNullOrEmpty(args.Result) == false) return args.Result;
375398
}
376399
switch (exp.NodeType) {
377-
case ExpressionType.Not: return $"not({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc)})";
400+
case ExpressionType.Not:
401+
var notExp = (exp as UnaryExpression)?.Operand;
402+
if (notExp.NodeType == ExpressionType.MemberAccess) return $"{ExpressionLambdaToSql(notExp, tsc)} = {formatSql(false, null)}";
403+
return $"not({ExpressionLambdaToSql(notExp, tsc)})";
378404
case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc);
379405
case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc);
380406
case ExpressionType.TypeAs:

0 commit comments

Comments
 (0)