From 8372f96ab15961f79db329011308d982592903d4 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 18 Mar 2019 12:16:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20int.Parse=20Guid.Parse=20?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E8=BD=AC=E6=8D=A2=E3=80=81Guid.NewGuid?= =?UTF-8?q?=E3=80=81new=20Random.NextDouble=20=E7=AD=89=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E5=87=BD=E6=95=B0=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataContext/SqlServer/SqlServerFixture.cs | 22 ++++--- FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs | 49 ++++++-------- .../MySql/MySqlExpression/ConvertTest.cs | 46 +++++++++++-- .../Oracle/OracleExpression/ConvertTest.cs | 48 +++++++++++--- .../PostgreSQLExpression/ConvertTest.cs | 46 +++++++++++-- .../SqlServerExpression/ConvertTest.cs | 37 ++++++++++- .../Sqlite/SqliteExpression/ConvertTest.cs | 48 +++++++++++--- FreeSql/Internal/CommonExpression.cs | 11 +++- FreeSql/MySql/MySqlExpression.cs | 59 +++++++++++++++++ FreeSql/Oracle/OracleExpression.cs | 59 +++++++++++++++++ FreeSql/PostgreSQL/PostgreSQLExpression.cs | 59 +++++++++++++++++ FreeSql/SqlServer/SqlServerExpression.cs | 64 ++++++++++++++++++- FreeSql/Sqlite/SqliteExpression.cs | 59 +++++++++++++++++ 13 files changed, 537 insertions(+), 70 deletions(-) diff --git a/FreeSql.Tests/DataContext/SqlServer/SqlServerFixture.cs b/FreeSql.Tests/DataContext/SqlServer/SqlServerFixture.cs index 1b3845c7..308a44a3 100644 --- a/FreeSql.Tests/DataContext/SqlServer/SqlServerFixture.cs +++ b/FreeSql.Tests/DataContext/SqlServer/SqlServerFixture.cs @@ -1,25 +1,31 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Text; -namespace FreeSql.Tests.DataContext.SqlServer -{ - public class SqlServerFixture : IDisposable - { - public SqlServerFixture() - { +namespace FreeSql.Tests.DataContext.SqlServer { + public class SqlServerFixture : IDisposable { + public SqlServerFixture() { sqlServerLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=10") //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=(localdb)\\mssqllocaldb;Integrated Security=True;Initial Catalog=cms;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) + + .UseMonitorCommand( + cmd => { + Trace.WriteLine(cmd.CommandText); + }, //监听SQL命令对象,在执行前 + (cmd, traceLog) => { + Console.WriteLine(traceLog); + }) //监听SQL命令对象,在执行后 + .Build()); // ... initialize data in the test database ... } - public void Dispose() - { + public void Dispose() { // ... clean up test data from the database ... } diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 22ef0528..84134211 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -284,8 +284,7 @@ namespace FreeSql.Tests.MySql { //����е�������a.Type��a.Type.Parent ���ǵ������� var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid); var sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid`", sql); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` WHERE (a__Type.`Guid` = a.`TypeGuid`)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid`", sql); query.ToList(); query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx"); @@ -295,7 +294,6 @@ namespace FreeSql.Tests.MySql { query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON 1 = 1 LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' WHERE (a__Type__Parent.`Id` = 10)", sql); Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); @@ -312,7 +310,6 @@ namespace FreeSql.Tests.MySql { query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` b__Parent ON 1 = 1 LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' WHERE (b__Parent.`Id` = 10)", sql); Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); @@ -325,11 +322,10 @@ namespace FreeSql.Tests.MySql { query.ToList(); query = select - .LeftJoin((a, b) => b.Guid == a.TypeGuid) + .LeftJoin((a, a__Type) => a__Type.Guid == a.TypeGuid) .LeftJoin((a, c) => c.Id == a.Type.ParentId); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` c ON c.`Id` = b.`ParentId`", sql); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON 1 = 1 LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` c ON c.`Id` = a__Type.`ParentId`", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` c ON c.`Id` = a__Type.`ParentId`", sql); query.ToList(); //���û�е�������b��c������ϵ @@ -366,7 +362,6 @@ namespace FreeSql.Tests.MySql { query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON 1 = 1 INNER JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' WHERE (a__Type__Parent.`Id` = 10)", sql); Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a INNER JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); @@ -383,7 +378,6 @@ namespace FreeSql.Tests.MySql { query = select.InnerJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` b__Parent ON 1 = 1 INNER JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' WHERE (b__Parent.`Id` = 10)", sql); Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a INNER JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); @@ -396,11 +390,10 @@ namespace FreeSql.Tests.MySql { query.ToList(); query = select - .InnerJoin((a, b) => b.Guid == a.TypeGuid) + .InnerJoin((a, a__Type) => a__Type.Guid == a.TypeGuid) .InnerJoin((a, c) => c.Id == a.Type.ParentId); sql = query.ToSql().Replace("\r\n", ""); - //Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a INNER JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` INNER JOIN `TestTypeParentInfo` c ON c.`Id` = b.`ParentId`", sql); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a INNER JOIN `TestTypeInfo` a__Type ON 1 = 1 INNER JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` c ON c.`Id` = a__Type.`ParentId`", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a INNER JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` INNER JOIN `TestTypeParentInfo` c ON c.`Id` = a__Type.`ParentId`", sql); query.ToList(); //���û�е�������b��c������ϵ @@ -438,7 +431,7 @@ namespace FreeSql.Tests.MySql { query = select.RightJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON 1 = 1 RIGHT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' WHERE (a__Type__Parent.`Id` = 10)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a RIGHT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); //���û�е������� @@ -454,7 +447,7 @@ namespace FreeSql.Tests.MySql { query = select.RightJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx").Where(a => a.Type.Parent.Id == 10); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeParentInfo` b__Parent ON 1 = 1 RIGHT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' WHERE (b__Parent.`Id` = 10)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a RIGHT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); query.ToList(); //������� @@ -466,10 +459,10 @@ namespace FreeSql.Tests.MySql { query.ToList(); query = select - .RightJoin((a, b) => b.Guid == a.TypeGuid) + .RightJoin((a, a__Type) => a__Type.Guid == a.TypeGuid) .RightJoin((a, c) => c.Id == a.Type.ParentId); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a RIGHT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` RIGHT JOIN `TestTypeParentInfo` c ON c.`Id` = b.`ParentId`", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a RIGHT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` RIGHT JOIN `TestTypeParentInfo` c ON c.`Id` = a__Type.`ParentId`", sql); query.ToList(); //���û�е�������b��c������ϵ @@ -512,17 +505,17 @@ namespace FreeSql.Tests.MySql { query = select.Where(a => a.Type.Name == "typeTitle"); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type WHERE (a__Type.`Name` = 'typeTitle')", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` WHERE (a__Type.`Name` = 'typeTitle')", sql); query.ToList(); query = select.Where(a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type WHERE (a__Type.`Name` = 'typeTitle' AND a__Type.`Guid` = a.`TypeGuid`)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` WHERE (a__Type.`Name` = 'typeTitle' AND a__Type.`Guid` = a.`TypeGuid`)", sql); query.ToList(); query = select.Where(a => a.Type.Parent.Name == "tparent"); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type, `TestTypeParentInfo` a__Type__Parent WHERE (a__Type__Parent.`Name` = 'tparent')", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Name` = 'tparent')", sql); query.ToList(); //���û�е������ԣ��򵥶������ @@ -546,7 +539,7 @@ namespace FreeSql.Tests.MySql { .Where(a => a.Id == 10 && c.Name == "xxx") .Where(a => b.ParentId == 20)); sql = query2.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeParentInfo` c, `TestTypeInfo` b WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` b, `TestTypeParentInfo` c WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20)", sql); query2.ToList(); //������϶����㲻�� @@ -575,17 +568,17 @@ namespace FreeSql.Tests.MySql { query = select.WhereIf(true, a => a.Type.Name == "typeTitle"); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type WHERE (a__Type.`Name` = 'typeTitle')", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` WHERE (a__Type.`Name` = 'typeTitle')", sql); query.ToList(); query = select.WhereIf(true, a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type WHERE (a__Type.`Name` = 'typeTitle' AND a__Type.`Guid` = a.`TypeGuid`)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` WHERE (a__Type.`Name` = 'typeTitle' AND a__Type.`Guid` = a.`TypeGuid`)", sql); query.ToList(); query = select.WhereIf(true, a => a.Type.Parent.Name == "tparent"); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` a__Type, `TestTypeParentInfo` a__Type__Parent WHERE (a__Type__Parent.`Name` = 'tparent')", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Name` = 'tparent')", sql); query.ToList(); //����һ�� From ��Ķ������ @@ -593,7 +586,7 @@ namespace FreeSql.Tests.MySql { .WhereIf(true, a => a.Id == 10 && c.Name == "xxx") .WhereIf(true, a => b.ParentId == 20)); sql = query2.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeParentInfo` c, `TestTypeInfo` b WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` b, `TestTypeParentInfo` c WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20)", sql); query2.ToList(); //������϶����㲻�� @@ -640,7 +633,7 @@ namespace FreeSql.Tests.MySql { .WhereIf(false, a => a.Id == 10 && c.Name == "xxx") .WhereIf(false, a => b.ParentId == 20)); sql = query2.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeInfo` b, `TestTypeParentInfo` c", sql); query2.ToList(); //������϶����㲻�� @@ -732,7 +725,7 @@ namespace FreeSql.Tests.MySql { query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10).AsTable(tableRule); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeParentInfoAsTable` a__Type__Parent ON 1 = 1 LEFT JOIN `TestTypeInfoAsTable2` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' WHERE (a__Type__Parent.`Id` = 10)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeInfoAsTable2` a__Type ON a__Type.`Guid` = a.`TypeGuid` AND a__Type.`Name` = 'xxx' LEFT JOIN `TestTypeParentInfoAsTable` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); //���û�е������� query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid).AsTable(tableRule); @@ -745,7 +738,7 @@ namespace FreeSql.Tests.MySql { query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx").Where(a => a.Type.Parent.Id == 10).AsTable(tableRule); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeParentInfoAsTable` b__Parent ON 1 = 1 LEFT JOIN `TestTypeInfoAsTable2` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' WHERE (b__Parent.`Id` = 10)", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeInfoAsTable2` b ON b.`Guid` = a.`TypeGuid` AND b.`Name` = 'xxx' LEFT JOIN `TestTypeInfoAsTable2` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfoAsTable` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId` WHERE (a__Type__Parent.`Id` = 10)", sql); //������� query = select @@ -758,7 +751,7 @@ namespace FreeSql.Tests.MySql { .LeftJoin((a, b) => b.Guid == a.TypeGuid) .LeftJoin((a, c) => c.Id == a.Type.ParentId).AsTable(tableRule); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeInfoAsTable2` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfoAsTable` c ON c.`Id` = b.`ParentId`", sql); + Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN `TestTypeInfoAsTable2` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeInfoAsTable2` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfoAsTable` c ON c.`Id` = a__Type.`ParentId`", sql); //���û�е�������b��c������ϵ var query2 = select.From((s, b, c) => s diff --git a/FreeSql.Tests/MySql/MySqlExpression/ConvertTest.cs b/FreeSql.Tests/MySql/MySqlExpression/ConvertTest.cs index 6f2a3c52..79462ef0 100644 --- a/FreeSql.Tests/MySql/MySqlExpression/ConvertTest.cs +++ b/FreeSql.Tests/MySql/MySqlExpression/ConvertTest.cs @@ -35,80 +35,112 @@ namespace FreeSql.Tests.MySqlExpression { [Fact] public void ToBoolean() { var data = new List(); - data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 2) > 0).ToList()); - //SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` - //FROM `tb_topic` a - //WHERE ((a.`Clicks` not in ('0','false'))) + data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList()); + data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList()); } [Fact] public void ToByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList()); + data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList()); } [Fact] public void ToChar() { var data = new List(); - data.Add(select.Where(a => Convert.ToBoolean(a.Clicks)).ToList()); + data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList()); + data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList()); } [Fact] public void ToDateTime() { var data = new List(); data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList()); + data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList()); } [Fact] public void ToDecimal() { var data = new List(); data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToDouble() { var data = new List(); data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt32() { var data = new List(); + data.Add(select.Where(a => (int)a.Clicks > 0).ToList()); data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToSByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToSByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList()); + data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList()); } [Fact] public void ToSingle() { var data = new List(); data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void this_ToString() { var data = new List(); data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList()); + data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList()); } [Fact] public void ToUInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt32() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList()); + } + + [Fact] + public void Guid_Parse() { + var data = new List(); + data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList()); + } + + [Fact] + public void Guid_NewGuid() { + var data = new List(); + //data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList()); + } + + [Fact] + public void Random() { + var data = new List(); + data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList()); + data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList()); } } } diff --git a/FreeSql.Tests/Oracle/OracleExpression/ConvertTest.cs b/FreeSql.Tests/Oracle/OracleExpression/ConvertTest.cs index 6a25445b..e01de2fe 100644 --- a/FreeSql.Tests/Oracle/OracleExpression/ConvertTest.cs +++ b/FreeSql.Tests/Oracle/OracleExpression/ConvertTest.cs @@ -34,81 +34,113 @@ namespace FreeSql.Tests.OracleExpression { [Fact] public void ToBoolean() { - //var data = new List(); - //data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 2) > 0).ToList()); - //SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` - //FROM `tb_topic` a - //WHERE ((a.`Clicks` not in ('0','false'))) + var data = new List(); + //data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList()); + //data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList()); } [Fact] public void ToByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList()); + data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList()); } [Fact] public void ToChar() { var data = new List(); - data.Add(select.Where(a => Convert.ToChar(a.Clicks) == 'a').ToList()); + data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList()); + data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList()); } [Fact] public void ToDateTime() { var data = new List(); data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList()); + data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList()); } [Fact] public void ToDecimal() { var data = new List(); data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToDouble() { var data = new List(); data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt32() { var data = new List(); + data.Add(select.Where(a => (int)a.Clicks > 0).ToList()); data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToSByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToSByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList()); + data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList()); } [Fact] public void ToSingle() { var data = new List(); data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void this_ToString() { var data = new List(); data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList()); + data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList()); } [Fact] public void ToUInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt32() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList()); + } + + [Fact] + public void Guid_Parse() { + var data = new List(); + data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList()); + } + + [Fact] + public void Guid_NewGuid() { + var data = new List(); + //data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList()); + } + + [Fact] + public void Random() { + var data = new List(); + data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList()); + data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList()); } } } diff --git a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/ConvertTest.cs b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/ConvertTest.cs index a7ceda76..73079bb2 100644 --- a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/ConvertTest.cs +++ b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/ConvertTest.cs @@ -35,80 +35,112 @@ namespace FreeSql.Tests.PostgreSQLExpression { [Fact] public void ToBoolean() { var data = new List(); - data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 2) > 0).ToList()); - //SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` - //FROM `tb_topic` a - //WHERE ((a.`Clicks` not in ('0','false'))) + data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList()); + data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList()); } [Fact] public void ToByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList()); + data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList()); } [Fact] public void ToChar() { var data = new List(); - data.Add(select.Where(a => Convert.ToBoolean(a.Clicks)).ToList()); + data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList()); + data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList()); } [Fact] public void ToDateTime() { var data = new List(); data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList()); + data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList()); } [Fact] public void ToDecimal() { var data = new List(); data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToDouble() { var data = new List(); data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt32() { var data = new List(); + data.Add(select.Where(a => (int)a.Clicks > 0).ToList()); data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToSByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToSByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList()); + data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList()); } [Fact] public void ToSingle() { var data = new List(); data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void this_ToString() { var data = new List(); data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList()); + data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList()); } [Fact] public void ToUInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt32() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList()); + } + + [Fact] + public void Guid_Parse() { + var data = new List(); + data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList()); + } + + [Fact] + public void Guid_NewGuid() { + var data = new List(); + //data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList()); + } + + [Fact] + public void Random() { + var data = new List(); + data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList()); + data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList()); } } } diff --git a/FreeSql.Tests/SqlServer/SqlServerExpression/ConvertTest.cs b/FreeSql.Tests/SqlServer/SqlServerExpression/ConvertTest.cs index 6f1d84a6..f5ed9207 100644 --- a/FreeSql.Tests/SqlServer/SqlServerExpression/ConvertTest.cs +++ b/FreeSql.Tests/SqlServer/SqlServerExpression/ConvertTest.cs @@ -45,76 +45,111 @@ namespace FreeSql.Tests.SqlServerExpression { public void ToBoolean() { var data = new List(); data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList()); + data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList()); } [Fact] public void ToByte() { var data = new List(); data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList()); + data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList()); } [Fact] public void ToChar() { var data = new List(); - data.Add(select.Where(a => Convert.ToBoolean(a.Clicks)).ToList()); + data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList()); + data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList()); } [Fact] public void ToDateTime() { var data = new List(); data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList()); + data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList()); } [Fact] public void ToDecimal() { var data = new List(); data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToDouble() { var data = new List(); data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt32() { var data = new List(); + data.Add(select.Where(a => (int)a.Clicks > 0).ToList()); data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToSByte() { var data = new List(); data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList()); + data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList()); } [Fact] public void ToSingle() { var data = new List(); data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void this_ToString() { var data = new List(); data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList()); + data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList()); } [Fact] public void ToUInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt32() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList()); + } + + [Fact] + public void Guid_Parse() { + var data = new List(); + data.Add(select.Where(a => Guid.Parse(Guid.NewGuid().ToString()) == Guid.Empty).ToList()); + } + + [Fact] + public void Guid_NewGuid() { + var data = new List(); + data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList()); + } + + [Fact] + public void Random() { + var data = new List(); + data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList()); + data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList()); } } } diff --git a/FreeSql.Tests/Sqlite/SqliteExpression/ConvertTest.cs b/FreeSql.Tests/Sqlite/SqliteExpression/ConvertTest.cs index 99cff2e0..0ce1de72 100644 --- a/FreeSql.Tests/Sqlite/SqliteExpression/ConvertTest.cs +++ b/FreeSql.Tests/Sqlite/SqliteExpression/ConvertTest.cs @@ -34,81 +34,113 @@ namespace FreeSql.Tests.SqliteExpression { [Fact] public void ToBoolean() { - //var data = new List(); - //data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 2) > 0).ToList()); - //SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` - //FROM `tb_topic` a - //WHERE ((a.`Clicks` not in ('0','false'))) + var data = new List(); + data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList()); + data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList()); } [Fact] public void ToByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList()); + data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList()); } [Fact] public void ToChar() { var data = new List(); - data.Add(select.Where(a => Convert.ToChar(a.Clicks) == 'a').ToList()); + data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList()); + data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList()); } [Fact] public void ToDateTime() { var data = new List(); data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList()); + data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList()); } [Fact] public void ToDecimal() { var data = new List(); data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToDouble() { var data = new List(); data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt32() { var data = new List(); + data.Add(select.Where(a => (int)a.Clicks > 0).ToList()); data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToSByte() { var data = new List(); - data.Add(select.Where(a => Convert.ToSByte(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList()); + data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList()); } [Fact] public void ToSingle() { var data = new List(); data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void this_ToString() { var data = new List(); data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList()); + data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList()); } [Fact] public void ToUInt16() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt32() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList()); } [Fact] public void ToUInt64() { var data = new List(); data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList()); + data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList()); + } + + [Fact] + public void Guid_Parse() { + var data = new List(); + data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList()); + } + + [Fact] + public void Guid_NewGuid() { + var data = new List(); + //data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList()); + } + + [Fact] + public void Random() { + var data = new List(); + data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList()); + data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList()); } } } diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 2fc99f89..16d2e57b 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -215,7 +215,10 @@ namespace FreeSql.Internal { case ExpressionType.Not: return $"not({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName)})"; case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); - case ExpressionType.Convert: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); + case ExpressionType.Convert: + var othercExp = ExpressionLambdaToSqlOther(exp, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); + if (string.IsNullOrEmpty(othercExp) == false) return othercExp; + return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); case ExpressionType.Negate: case ExpressionType.NegateChecked: return "-" + ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); case ExpressionType.Constant: return _common.FormatSql("{0}", (exp as ConstantExpression)?.Value); @@ -461,7 +464,7 @@ namespace FreeSql.Internal { MethodCallExpression callExp = null; var exp2 = exp4.Expression; while (true) { - switch(exp2.NodeType) { + switch(exp2?.NodeType) { case ExpressionType.Constant: expStack.Push(exp2); break; @@ -514,6 +517,10 @@ namespace FreeSql.Internal { finds = _tables.Where(a2 => (isa && a2.Parameter != null || !isa && a2.Parameter == null) && a2.Table.Type == tbtmp.Type && a2.Alias == alias && a2.Alias.StartsWith($"{navdot[0].Alias}__") && (isthis && a2.Type != SelectTableInfoType.Parent || !isthis && a2.Type == SelectTableInfoType.Parent)).ToArray(); + if (finds.Length == 0) + finds = _tables.Where(a2 => + a2.Table.Type == tbtmp.Type && a2.Alias == alias && a2.Alias.StartsWith($"{navdot[0].Alias}__") && + (isthis && a2.Type != SelectTableInfoType.Parent || !isthis && a2.Type == SelectTableInfoType.Parent)).ToArray(); } else { finds = _tables.Where(a2 => (isa && a2.Parameter != null || isa && a2.Parameter == null) && a2.Table.Type == tbtmp.Type && a2.Alias == alias).ToArray(); diff --git a/FreeSql/MySql/MySqlExpression.cs b/FreeSql/MySql/MySqlExpression.cs index 30eee006..2f91d257 100644 --- a/FreeSql/MySql/MySqlExpression.cs +++ b/FreeSql/MySql/MySqlExpression.cs @@ -15,8 +15,67 @@ namespace FreeSql.MySql { internal override string ExpressionLambdaToSqlOther(Expression exp, List _tables, List _selectColumnMap, Func getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) { Func getExp = exparg => ExpressionLambdaToSql(exparg, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); switch (exp.NodeType) { + case ExpressionType.Convert: + var operandExp = (exp as UnaryExpression)?.Operand; + switch (exp.Type.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"({getExp(operandExp)} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(operandExp)} as unsigned)"; + case "System.Char": return $"substr(cast({getExp(operandExp)} as char), 1, 1)"; + case "System.DateTime": return $"cast({getExp(operandExp)} as datetime)"; + case "System.Decimal": return $"cast({getExp(operandExp)} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(operandExp)} as decimal(32,16))"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(operandExp)} as signed)"; + case "System.Single": return $"cast({getExp(operandExp)} as decimal(14,7))"; + case "System.String": return $"cast({getExp(operandExp)} as char)"; + case "System.UInt16": + case "System.UInt32": + case "System.UInt64": return $"cast({getExp(operandExp)} as unsigned)"; + case "System.Guid": return $"substr(cast({getExp(operandExp)} as char), 1, 36)"; + } + break; case ExpressionType.Call: var callExp = exp as MethodCallExpression; + + switch (callExp.Method.Name) { + case "Parse": + case "TryParse": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"({getExp(callExp.Arguments[0])} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as unsigned)"; + case "System.Char": return $"substr(cast({getExp(callExp.Arguments[0])} as char), 1, 1)"; + case "System.DateTime": return $"cast({getExp(callExp.Arguments[0])} as datetime)"; + case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as decimal(32,16))"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(callExp.Arguments[0])} as signed)"; + case "System.Single": return $"cast({getExp(callExp.Arguments[0])} as decimal(14,7))"; + case "System.UInt16": + case "System.UInt32": + case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as unsigned)"; + case "System.Guid": return $"substr(cast({getExp(callExp.Arguments[0])} as char), 1, 36)"; + } + break; + case "NewGuid": + break; + case "Next": + if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as signed)"; + break; + case "NextDouble": + if (callExp.Object?.Type == typeof(Random)) return "rand()"; + break; + case "Random": + if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; + break; + case "ToString": + if (callExp.Object != null) return $"cast({getExp(callExp.Object)} as char)"; + break; + } + var objExp = callExp.Object; var objType = objExp?.Type; if (objType?.FullName == "System.Byte[]") return null; diff --git a/FreeSql/Oracle/OracleExpression.cs b/FreeSql/Oracle/OracleExpression.cs index d2f7a03e..3c48344e 100644 --- a/FreeSql/Oracle/OracleExpression.cs +++ b/FreeSql/Oracle/OracleExpression.cs @@ -15,8 +15,67 @@ namespace FreeSql.Oracle { internal override string ExpressionLambdaToSqlOther(Expression exp, List _tables, List _selectColumnMap, Func getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) { Func getExp = exparg => ExpressionLambdaToSql(exparg, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); switch (exp.NodeType) { + case ExpressionType.Convert: + var operandExp = (exp as UnaryExpression)?.Operand; + switch (exp.Type.NullableTypeOrThis().ToString()) { + //case "System.Boolean": return $"({getExp(operandExp)} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(operandExp)} as number)"; + case "System.Char": return $"substr(to_char({getExp(operandExp)}), 1, 1)"; + case "System.DateTime": return $"to_timestamp({getExp(operandExp)},'YYYY-MM-DD HH24:MI:SS.FF6')"; + case "System.Decimal": return $"cast({getExp(operandExp)} as number)"; + case "System.Double": return $"cast({getExp(operandExp)} as number)"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(operandExp)} as number)"; + case "System.Single": return $"cast({getExp(operandExp)} as number)"; + case "System.String": return $"to_char({getExp(operandExp)})"; + case "System.UInt16": + case "System.UInt32": + case "System.UInt64": return $"cast({getExp(operandExp)} as number)"; + case "System.Guid": return $"substr(to_char({getExp(operandExp)}), 1, 36)"; + } + break; case ExpressionType.Call: var callExp = exp as MethodCallExpression; + + switch (callExp.Method.Name) { + case "Parse": + case "TryParse": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + //case "System.Boolean": return $"({getExp(callExp.Arguments[0])} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.Char": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 1)"; + case "System.DateTime": return $"to_timestamp({getExp(callExp.Arguments[0])},'YYYY-MM-DD HH24:MI:SS.FF6')"; + case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.Single": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.UInt16": + case "System.UInt32": + case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)"; + case "System.Guid": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 36)"; + } + break; + case "NewGuid": + break; + case "Next": + if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)"; + break; + case "NextDouble": + if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value"; + break; + case "Random": + if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; + break; + case "ToString": + if (callExp.Object != null) return $"to_char({getExp(callExp.Object)})"; + break; + } + var objExp = callExp.Object; var objType = objExp?.Type; if (objType?.FullName == "System.Byte[]") return null; diff --git a/FreeSql/PostgreSQL/PostgreSQLExpression.cs b/FreeSql/PostgreSQL/PostgreSQLExpression.cs index 84372fb7..39a187eb 100644 --- a/FreeSql/PostgreSQL/PostgreSQLExpression.cs +++ b/FreeSql/PostgreSQL/PostgreSQLExpression.cs @@ -16,12 +16,71 @@ namespace FreeSql.PostgreSQL { internal override string ExpressionLambdaToSqlOther(Expression exp, List _tables, List _selectColumnMap, Func getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) { Func getExp = exparg => ExpressionLambdaToSql(exparg, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); switch (exp.NodeType) { + case ExpressionType.Convert: + var operandExp = (exp as UnaryExpression)?.Operand; + switch (exp.Type.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"(({getExp(operandExp)})::varchar not in ('0','false','f','no'))"; + case "System.Byte": return $"({getExp(operandExp)})::int2"; + case "System.Char": return $"substr(({getExp(operandExp)})::char, 1, 1)"; + case "System.DateTime": return $"({getExp(operandExp)})::timestamp"; + case "System.Decimal": return $"({getExp(operandExp)})::numeric"; + case "System.Double": return $"({getExp(operandExp)})::float8"; + case "System.Int16": return $"({getExp(operandExp)})::int2"; + case "System.Int32": return $"({getExp(operandExp)})::int4"; + case "System.Int64": return $"({getExp(operandExp)})::int8"; + case "System.SByte": return $"({getExp(operandExp)})::int2"; + case "System.Single": return $"({getExp(operandExp)})::float4"; + case "System.String": return $"({getExp(operandExp)})::varchar"; + case "System.UInt16": return $"({getExp(operandExp)})::int2"; + case "System.UInt32": return $"({getExp(operandExp)})::int4"; + case "System.UInt64": return $"({getExp(operandExp)})::int8"; + case "System.Guid": return $"({getExp(operandExp)})::uuid"; + } + break; case ExpressionType.ArrayLength: var arrOperExp = getExp((exp as UnaryExpression).Operand); if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)"; return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end"; case ExpressionType.Call: var callExp = exp as MethodCallExpression; + + switch (callExp.Method.Name) { + case "Parse": + case "TryParse": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"(({getExp(callExp.Arguments[0])})::varchar not in ('0','false','f','no'))"; + case "System.Byte": return $"({getExp(callExp.Arguments[0])})::int2"; + case "System.Char": return $"substr(({getExp(callExp.Arguments[0])})::char, 1, 1)"; + case "System.DateTime": return $"({getExp(callExp.Arguments[0])})::timestamp"; + case "System.Decimal": return $"({getExp(callExp.Arguments[0])})::numeric"; + case "System.Double": return $"({getExp(callExp.Arguments[0])})::float8"; + case "System.Int16": return $"({getExp(callExp.Arguments[0])})::int2"; + case "System.Int32": return $"({getExp(callExp.Arguments[0])})::int4"; + case "System.Int64": return $"({getExp(callExp.Arguments[0])})::int8"; + case "System.SByte": return $"({getExp(callExp.Arguments[0])})::int2"; + case "System.Single": return $"({getExp(callExp.Arguments[0])})::float4"; + case "System.UInt16": return $"({getExp(callExp.Arguments[0])})::int2"; + case "System.UInt32": return $"({getExp(callExp.Arguments[0])})::int4"; + case "System.UInt64": return $"({getExp(callExp.Arguments[0])})::int8"; + case "System.Guid": return $"({getExp(callExp.Arguments[0])})::uuid"; + } + break; + case "NewGuid": + break; + case "Next": + if (callExp.Object?.Type == typeof(Random)) return "(random()*1000000000)::int4"; + break; + case "NextDouble": + if (callExp.Object?.Type == typeof(Random)) return "random()"; + break; + case "Random": + if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; + break; + case "ToString": + if (callExp.Object != null) return $"({getExp(callExp.Object)})::varchar"; + break; + } + var objExp = callExp.Object; var objType = objExp?.Type; if (objType?.FullName == "System.Byte[]") return null; diff --git a/FreeSql/SqlServer/SqlServerExpression.cs b/FreeSql/SqlServer/SqlServerExpression.cs index 39c3eef8..20bab352 100644 --- a/FreeSql/SqlServer/SqlServerExpression.cs +++ b/FreeSql/SqlServer/SqlServerExpression.cs @@ -15,8 +15,70 @@ namespace FreeSql.SqlServer { internal override string ExpressionLambdaToSqlOther(Expression exp, List _tables, List _selectColumnMap, Func getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) { Func getExp = exparg => ExpressionLambdaToSql(exparg, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); switch (exp.NodeType) { + case ExpressionType.Convert: + var operandExp = (exp as UnaryExpression)?.Operand; + switch (exp.Type.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"(cast({getExp(operandExp)} as varchar) not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(operandExp)} as tinyint)"; + case "System.Char": return $"substring(cast({getExp(operandExp)} as nvarchar),1,1)"; + case "System.DateTime": return $"cast({getExp(operandExp)} as datetime)"; + case "System.Decimal": return $"cast({getExp(operandExp)} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(operandExp)} as decimal(32,16))"; + case "System.Int16": return $"cast({getExp(operandExp)} as smallint)"; + case "System.Int32": return $"cast({getExp(operandExp)} as int)"; + case "System.Int64": return $"cast({getExp(operandExp)} as bigint)"; + case "System.SByte": return $"cast({getExp(operandExp)} as tinyint)"; + case "System.Single": return $"cast({getExp(operandExp)} as decimal(14,7))"; + case "System.String": return operandExp.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(operandExp)} as varchar(36))" : $"cast({getExp(operandExp)} as nvarchar)"; + case "System.UInt16": return $"cast({getExp(operandExp)} as smallint)"; + case "System.UInt32": return $"cast({getExp(operandExp)} as int)"; + case "System.UInt64": return $"cast({getExp(operandExp)} as bigint)"; + case "System.Guid": return $"cast({getExp(operandExp)} as uniqueidentifier)"; + } + break; case ExpressionType.Call: var callExp = exp as MethodCallExpression; + + switch(callExp.Method.Name) { + case "Parse": + case "TryParse": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"(cast({getExp(callExp.Arguments[0])} as varchar) not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as tinyint)"; + case "System.Char": return $"substring(cast({getExp(callExp.Arguments[0])} as nvarchar),1,1)"; + case "System.DateTime": return $"cast({getExp(callExp.Arguments[0])} as datetime)"; + case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as decimal(32,16))"; + case "System.Int16": return $"cast({getExp(callExp.Arguments[0])} as smallint)"; + case "System.Int32": return $"cast({getExp(callExp.Arguments[0])} as int)"; + case "System.Int64": return $"cast({getExp(callExp.Arguments[0])} as bigint)"; + case "System.SByte": return $"cast({getExp(callExp.Arguments[0])} as tinyint)"; + case "System.Single": return $"cast({getExp(callExp.Arguments[0])} as decimal(14,7))"; + case "System.UInt16": return $"cast({getExp(callExp.Arguments[0])} as smallint)"; + case "System.UInt32": return $"cast({getExp(callExp.Arguments[0])} as int)"; + case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as bigint)"; + case "System.Guid": return $"cast({getExp(callExp.Arguments[0])} as uniqueidentifier)"; + } + break; + case "NewGuid": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + case "System.Guid": return $"newid()"; + } + break; + case "Next": + if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as int)"; + break; + case "NextDouble": + if (callExp.Object?.Type == typeof(Random)) return "rand()"; + break; + case "Random": + if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; + break; + case "ToString": + if (callExp.Object != null) return callExp.Object.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar)"; + break; + } + var objExp = callExp.Object; var objType = objExp?.Type; if (objType?.FullName == "System.Byte[]") return null; @@ -306,7 +368,7 @@ namespace FreeSql.SqlServer { case "ToInt64": return $"cast({getExp(exp.Arguments[0])} as bigint)"; case "ToSByte": return $"cast({getExp(exp.Arguments[0])} as tinyint)"; case "ToSingle": return $"cast({getExp(exp.Arguments[0])} as decimal(14,7))"; - case "ToString": return $"cast({getExp(exp.Arguments[0])} as nvarchar)"; + case "ToString": return exp.Arguments[0].Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(exp.Arguments[0])} as varchar(36))" : $"cast({getExp(exp.Arguments[0])} as nvarchar)"; case "ToUInt16": return $"cast({getExp(exp.Arguments[0])} as smallint)"; case "ToUInt32": return $"cast({getExp(exp.Arguments[0])} as int)"; case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as bigint)"; diff --git a/FreeSql/Sqlite/SqliteExpression.cs b/FreeSql/Sqlite/SqliteExpression.cs index ff1e40a1..832880fb 100644 --- a/FreeSql/Sqlite/SqliteExpression.cs +++ b/FreeSql/Sqlite/SqliteExpression.cs @@ -15,8 +15,67 @@ namespace FreeSql.Sqlite { internal override string ExpressionLambdaToSqlOther(Expression exp, List _tables, List _selectColumnMap, Func getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) { Func getExp = exparg => ExpressionLambdaToSql(exparg, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); switch (exp.NodeType) { + case ExpressionType.Convert: + var operandExp = (exp as UnaryExpression)?.Operand; + switch (exp.Type.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"({getExp(operandExp)} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(operandExp)} as int2)"; + case "System.Char": return $"substr(cast({getExp(operandExp)} as character), 1, 1)"; + case "System.DateTime": return $"datetime({getExp(operandExp)})"; + case "System.Decimal": return $"cast({getExp(operandExp)} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(operandExp)} as double)"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(operandExp)} as smallint)"; + case "System.Single": return $"cast({getExp(operandExp)} as float)"; + case "System.String": return $"cast({getExp(operandExp)} as character)"; + case "System.UInt16": return $"cast({getExp(operandExp)} as unsigned)"; + case "System.UInt32": return $"cast({getExp(operandExp)} as decimal(10,0))"; + case "System.UInt64": return $"cast({getExp(operandExp)} as decimal(21,0))"; + case "System.Guid": return $"substr(cast({getExp(operandExp)} as character), 1, 36)"; + } + break; case ExpressionType.Call: var callExp = exp as MethodCallExpression; + + switch (callExp.Method.Name) { + case "Parse": + case "TryParse": + switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { + case "System.Boolean": return $"({getExp(callExp.Arguments[0])} not in ('0','false'))"; + case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as int2)"; + case "System.Char": return $"substr(cast({getExp(callExp.Arguments[0])} as character), 1, 1)"; + case "System.DateTime": return $"datetime({getExp(callExp.Arguments[0])})"; + case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as decimal(36,18))"; + case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as double)"; + case "System.Int16": + case "System.Int32": + case "System.Int64": + case "System.SByte": return $"cast({getExp(callExp.Arguments[0])} as smallint)"; + case "System.Single": return $"cast({getExp(callExp.Arguments[0])} as float)"; + case "System.UInt16": return $"cast({getExp(callExp.Arguments[0])} as unsigned)"; + case "System.UInt32": return $"cast({getExp(callExp.Arguments[0])} as decimal(10,0))"; + case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as decimal(21,0))"; + case "System.Guid": return $"substr(cast({getExp(callExp.Arguments[0])} as character), 1, 36)"; + } + break; + case "NewGuid": + break; + case "Next": + if (callExp.Object?.Type == typeof(Random)) return "cast(random()*1000000000 as int)"; + break; + case "NextDouble": + if (callExp.Object?.Type == typeof(Random)) return "random()"; + break; + case "Random": + if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; + break; + case "ToString": + if (callExp.Object != null) return $"cast({getExp(callExp.Object)} as character)"; + break; + } + var objExp = callExp.Object; var objType = objExp?.Type; if (objType?.FullName == "System.Byte[]") return null;