mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 修复 Array.Any OR 表达式树解析 bug;
This commit is contained in:
parent
f68f7d8277
commit
7e39e1bb18
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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()})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user