- 修复 Array.Any OR 表达式树解析 bug;

This commit is contained in:
2881099 2023-02-07 10:49:52 +08:00
parent f68f7d8277
commit 7e39e1bb18
2 changed files with 41 additions and 2 deletions

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -17,6 +17,45 @@ namespace FreeSql.Tests.MySqlExpression
} }
[Fact]
public void ArrayAnyOr()
{
var arr = new int[] { 1, 3, 8 };
var t1 = select.Where(a => arr.Any(x => a.testFieldInt == x)).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE ((a.`testFieldInt` = 1 OR a.`testFieldInt` = 3 OR a.`testFieldInt` = 8))", t1);
var t2 = select.Where(a => a.Id == 100 && arr.Any(x => a.testFieldInt == x)).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE (a.`Id` = 100 AND (a.`testFieldInt` = 1 OR a.`testFieldInt` = 3 OR a.`testFieldInt` = 8))", t2);
var t3 = select.Where(a => arr.Any(x => a.testFieldInt == x) && a.Id == 101).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE ((a.`testFieldInt` = 1 OR a.`testFieldInt` = 3 OR a.`testFieldInt` = 8) AND a.`Id` = 101)", t3);
var t4 = select.Where(a => a.Id == 100 && arr.Any(x => a.testFieldInt == x) && a.Id == 101).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE (a.`Id` = 100 AND (a.`testFieldInt` = 1 OR a.`testFieldInt` = 3 OR a.`testFieldInt` = 8) AND a.`Id` = 101)", t4);
var t11 = select.Where(a => arr.Any(x => a.testFieldInt == x && a.testFieldLong > x)).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE ((a.`testFieldInt` = 1 AND a.`testFieldLong` > 1 OR a.`testFieldInt` = 3 AND a.`testFieldLong` > 3 OR a.`testFieldInt` = 8 AND a.`testFieldLong` > 8))", t11);
var t22 = select.Where(a => a.Id == 100 && arr.Any(x => a.testFieldInt == x && a.testFieldLong > x)).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE (a.`Id` = 100 AND (a.`testFieldInt` = 1 AND a.`testFieldLong` > 1 OR a.`testFieldInt` = 3 AND a.`testFieldLong` > 3 OR a.`testFieldInt` = 8 AND a.`testFieldLong` > 8))", t22);
var t33 = select.Where(a => arr.Any(x => a.testFieldInt == x && a.testFieldLong > x) && a.Id == 101).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE ((a.`testFieldInt` = 1 AND a.`testFieldLong` > 1 OR a.`testFieldInt` = 3 AND a.`testFieldLong` > 3 OR a.`testFieldInt` = 8 AND a.`testFieldLong` > 8) AND a.`Id` = 101)", t33);
var t44 = select.Where(a => a.Id == 100 && arr.Any(x => a.testFieldInt == x && a.testFieldLong > x) && a.Id == 101).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`testFieldBool`, a.`testFieldSByte`, a.`testFieldShort`, a.`testFieldInt`, a.`testFieldLong`, a.`testFieldByte`, a.`testFieldUShort`, a.`testFieldUInt`, a.`testFieldULong`, a.`testFieldDouble`, a.`testFieldFloat`, a.`testFieldDecimal`, a.`testFieldTimeSpan`, a.`testFieldDateTime`, a.`testFieldBytes`, a.`testFieldString`, a.`testFieldGuid`, a.`testFieldBoolNullable`, a.`testFieldSByteNullable`, a.`testFieldShortNullable`, a.`testFieldIntNullable`, a.`testFielLongNullable`, a.`testFieldByteNullable`, a.`testFieldUShortNullable`, a.`testFieldUIntNullable`, a.`testFieldULongNullable`, a.`testFieldDoubleNullable`, a.`testFieldFloatNullable`, a.`testFieldDecimalNullable`, a.`testFieldTimeSpanNullable`, a.`testFieldDateTimeNullable`, a.`testFieldGuidNullable`, ST_AsText(a.`testFieldPoint`) `testFieldPoint`, ST_AsText(a.`testFieldLineString`) `testFieldLineString`, ST_AsText(a.`testFieldPolygon`) `testFieldPolygon`, ST_AsText(a.`testFieldMultiPoint`) `testFieldMultiPoint`, ST_AsText(a.`testFieldMultiLineString`) `testFieldMultiLineString`, ST_AsText(a.`testFieldMultiPolygon`) `testFieldMultiPolygon`, a.`testFieldEnum1`, a.`testFieldEnum1Nullable`, a.`testFieldEnum2`, a.`testFieldEnum2Nullable`
FROM `tb_alltype` a
WHERE (a.`Id` = 100 AND (a.`testFieldInt` = 1 AND a.`testFieldLong` > 1 OR a.`testFieldInt` = 3 AND a.`testFieldLong` > 3 OR a.`testFieldInt` = 8 AND a.`testFieldLong` > 8) AND a.`Id` = 101)", t44);
}
[Fact] [Fact]
public void Div() public void Div()
{ {

View File

@ -1113,7 +1113,7 @@ namespace FreeSql.Internal
exp3sb.Append(" OR ").Append(ExpressionLambdaToSql(exp3NewExp, tsc)); exp3sb.Append(" OR ").Append(ExpressionLambdaToSql(exp3NewExp, tsc));
} }
if (exp3sb.Length == 0) return "1=2"; if (exp3sb.Length == 0) return "1=2";
return exp3sb.Remove(0, 4).ToString(); return $"({exp3sb.Remove(0, 4).ToString()})";
} }
} }
} }