diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs index 997c0718..81a1d05a 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using MySql.Data.MySqlClient; using System; 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] public void Div() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index efb496d7..f95e1ca4 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1113,7 +1113,7 @@ namespace FreeSql.Internal exp3sb.Append(" OR ").Append(ExpressionLambdaToSql(exp3NewExp, tsc)); } if (exp3sb.Length == 0) return "1=2"; - return exp3sb.Remove(0, 4).ToString(); + return $"({exp3sb.Remove(0, 4).ToString()})"; } } }