From 8f1bce05742a5117ce0830ff0a871ecc46e7a326 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 8 May 2019 16:12:33 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E7=9A=84=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90=20OR=20?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs | 5 ++-- FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs | 5 ++-- .../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 5 ++-- .../SqlServer/Curd/SqlServerSelectTest.cs | 5 ++-- FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs | 5 ++-- FreeSql.Tests/UnitTest1.cs | 27 +++++++++++++++++++ FreeSql/FreeSql.csproj | 2 +- FreeSql/Internal/CommonExpression.cs | 2 +- 8 files changed, 44 insertions(+), 12 deletions(-) diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index af8b32dd..00418502 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -539,6 +539,7 @@ namespace FreeSql.Tests.MySql { var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql(); var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql(); + var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql(); //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.Where(a => a.Id == 10); @@ -548,7 +549,7 @@ namespace FreeSql.Tests.MySql { query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100))", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (((a.`Id` = 10 AND a.`Id` > 10) OR (a.`Clicks` > 100)))", sql); query.ToList(); query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100); @@ -611,7 +612,7 @@ namespace FreeSql.Tests.MySql { query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100))", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (((a.`Id` = 10 AND a.`Id` > 10) OR (a.`Clicks` > 100)))", sql); query.ToList(); query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100); diff --git a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 9a203f92..c217a156 100644 --- a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -435,6 +435,7 @@ namespace FreeSql.Tests.Oracle { public void Where() { var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql(); var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql(); + var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql(); //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.Where(a => a.Id == 10); @@ -444,7 +445,7 @@ namespace FreeSql.Tests.Oracle { query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql); + Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (((a.\"ID\" = 10 AND a.\"ID\" > 10) OR (a.\"CLICKS\" > 100)))", sql); query.ToList(); query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100); @@ -507,7 +508,7 @@ namespace FreeSql.Tests.Oracle { query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql); + Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (((a.\"ID\" = 10 AND a.\"ID\" > 10) OR (a.\"CLICKS\" > 100)))", sql); query.ToList(); query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100); diff --git a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index e8004c49..36a8033f 100644 --- a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -506,6 +506,7 @@ namespace FreeSql.Tests.PostgreSQL { public void Where() { var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql(); var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql(); + var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql(); //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.Where(a => a.Id == 10); @@ -515,7 +516,7 @@ namespace FreeSql.Tests.PostgreSQL { query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE ((a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100))", sql); + Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE (((a.\"id\" = 10 AND a.\"id\" > 10) OR (a.\"clicks\" > 100)))", sql); query.ToList(); query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100); @@ -578,7 +579,7 @@ namespace FreeSql.Tests.PostgreSQL { query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE ((a.\"id\" = 10 AND a.\"id\" > 10 OR a.\"clicks\" > 100))", sql); + Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a WHERE (((a.\"id\" = 10 AND a.\"id\" > 10) OR (a.\"clicks\" > 100)))", sql); query.ToList(); query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100); diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index b5ec7ef9..fce282cb 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -437,6 +437,7 @@ namespace FreeSql.Tests.SqlServer { public void Where() { var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql(); var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql(); + var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql(); //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.Where(a => a.Id == 10); @@ -446,7 +447,7 @@ namespace FreeSql.Tests.SqlServer { query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE ((a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100))", sql); + Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE (((a.[Id] = 10 AND a.[Id] > 10) OR (a.[Clicks] > 100)))", sql); query.ToList(); query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100); @@ -509,7 +510,7 @@ namespace FreeSql.Tests.SqlServer { query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE ((a.[Id] = 10 AND a.[Id] > 10 OR a.[Clicks] > 100))", sql); + Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a WHERE (((a.[Id] = 10 AND a.[Id] > 10) OR (a.[Clicks] > 100)))", sql); query.ToList(); query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100); diff --git a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 5b890e49..d7afdafb 100644 --- a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -381,6 +381,7 @@ namespace FreeSql.Tests.Sqlite { public void Where() { var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql(); var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql(); + var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql(); //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.Where(a => a.Id == 10); @@ -390,7 +391,7 @@ namespace FreeSql.Tests.Sqlite { query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE ((a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100))", sql); + Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE (((a.\"Id\" = 10 AND a.\"Id\" > 10) OR (a.\"Clicks\" > 100)))", sql); query.ToList(); query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100); @@ -453,7 +454,7 @@ namespace FreeSql.Tests.Sqlite { query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE ((a.\"Id\" = 10 AND a.\"Id\" > 10 OR a.\"Clicks\" > 100))", sql); + Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a WHERE (((a.\"Id\" = 10 AND a.\"Id\" > 10) OR (a.\"Clicks\" > 100)))", sql); query.ToList(); query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100); diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index ab0b1e89..7218e6bb 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -86,8 +86,35 @@ namespace FreeSql.Tests { public abstract Task Persistent(); } + public class Model1 { + [Column(IsIdentity = true)] + public int id { get; set; } + + public string title { get; set; } + + public ICollection Childs { get; set; } + + } + + public class Model2 { + + [Column(IsIdentity = true)] + public int id { get; set; } + public string title { get; set; } + + public Model1 Parent { get; set; } + public int parent_id { get; set; } + + } + [Fact] public void Test1() { + + var ttt1 = g.sqlite.Select().Where(a => a.Childs.AsSelect().Any(b => b.title == "111")).ToList(); + + + + var linqto1 = from p in g.sqlite.Select() where p.Id >= 0 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index e6e6f3ed..5707fca9 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.9 + 0.5.10 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 9003906f..53e202cb 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -868,7 +868,7 @@ namespace FreeSql.Internal { case ExpressionType.Coalesce: return _common.IsNull(ExpressionLambdaToSql(expBinary.Left, tsc), ExpressionLambdaToSql(expBinary.Right, tsc)); case ExpressionType.OrElse: - return $"({ExpressionLambdaToSql(expBinary.Left, tsc)} OR {ExpressionLambdaToSql(expBinary.Right, tsc)})"; + return $"(({ExpressionLambdaToSql(expBinary.Left, tsc)}) OR ({ExpressionLambdaToSql(expBinary.Right, tsc)}))"; } if (dicExpressionOperator.TryGetValue(expBinary.NodeType, out var tryoper) == false) return "";