diff --git a/Directory.Build.props b/Directory.Build.props index 1325aa85..1fb4e591 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -9,7 +9,7 @@ - 3.2.606 + 3.2.650-preview20220518 diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index fd4c629a..1dad165e 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -14,10 +14,12 @@ using System.Data.SQLite; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; +using System.Numerics; using System.Reflection; using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -131,7 +133,7 @@ namespace base_entity public string ShippingAddress { get; set; } } - [Table(Name = "tb_TopicMapTypeToListDto")] + [Table(Name = "tb_tmttld"), OraclePrimaryKeyName("TMTTLD_PK01")] class TopicMapTypeToListDto { [Column(IsIdentity = true, IsPrimary = true)] @@ -158,8 +160,11 @@ namespace base_entity public string Title { get; set; } public DateTime CreateTime { get; set; } } - - + class tuint256tb_01 + { + public Guid Id { get; set; } + public BigInteger Number { get; set; } + } class CommandTimeoutCascade : IDisposable { public static AsyncLocal _asyncLocalTimeout = new AsyncLocal(); @@ -178,12 +183,15 @@ namespace base_entity //.UseSlaveWeight(10, 1, 1, 5) + //.UseConnectionString(FreeSql.DataType.Firebird, @"database=localhost:D:\fbdata\EXAMPLES.fdb;user=sysdba;password=123456;max pool size=5") + + //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2") //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") - .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") - .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) + //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") + //.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) @@ -208,12 +216,62 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + if (fsql.Ado.DataType == DataType.PostgreSQL) + { + fsql.CodeFirst.IsNoneCommandParameter = false; + fsql.Aop.AuditDataReader += (_, e) => + { + var dbtype = e.DataReader.GetDataTypeName(e.Index); + var m = Regex.Match(dbtype, @"numeric\((\d+)\)", RegexOptions.IgnoreCase); + if (m.Success && int.Parse(m.Groups[1].Value) > 19) + e.Value = e.DataReader.GetFieldValue(e.Index); //否则会报溢出错误 + }; + + var num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968"); + fsql.Delete().Where("1=1").ExecuteAffrows(); + if (1 != fsql.Insert(new tuint256tb_01()).ExecuteAffrows()) throw new Exception("not equal"); + var find = fsql.Select().ToList(); + if (find.Count != 1) throw new Exception("not single"); + if ("0" != find[0].Number.ToString()) throw new Exception("not equal"); + var item = new tuint256tb_01 { Number = num }; + if (1 != fsql.Insert(item).ExecuteAffrows()) throw new Exception("not equal"); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + if (find.Count != 1) throw new Exception("not single"); + if (item.Number != find[0].Number) throw new Exception("not equal"); + num = num - 1; + item.Number = num; + if (1 != fsql.Update().SetSource(item).ExecuteAffrows()) throw new Exception("not equal"); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + if (find.Count != 1) throw new Exception("not single"); + if ("57896044618658097711785492504343953926634992332820282019728792003956564819967" != find[0].Number.ToString()) throw new Exception("not equal"); + + num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968"); + fsql.Delete().Where("1=1").ExecuteAffrows(); + if (1 != fsql.Insert(new tuint256tb_01()).NoneParameter().ExecuteAffrows()) throw new Exception("not equal"); + find = fsql.Select().ToList(); + if (find.Count != 1) throw new Exception("not single"); + if ("0" != find[0].Number.ToString()) throw new Exception("not equal"); + item = new tuint256tb_01 { Number = num }; + if (1 != fsql.Insert(item).NoneParameter().ExecuteAffrows()) throw new Exception("not equal"); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + if (find.Count != 1) throw new Exception("not single"); + if (item.Number != find[0].Number) throw new Exception("not equal"); + num = num - 1; + item.Number = num; + if (1 != fsql.Update().NoneParameter().SetSource(item).ExecuteAffrows()) throw new Exception("not equal"); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + if (find.Count != 1) throw new Exception("not single"); + if ("57896044618658097711785492504343953926634992332820282019728792003956564819967" != find[0].Number.ToString()) throw new Exception("not equal"); + } + + + fsql.Aop.CommandBefore += (_, e) => { if (CommandTimeoutCascade._asyncLocalTimeout.Value > 0) e.Command.CommandTimeout = CommandTimeoutCascade._asyncLocalTimeout.Value; }; - + using (new CommandTimeoutCascade(1000)) { fsql.Select().ToList(); @@ -222,6 +280,16 @@ namespace base_entity } + var sql1 = fsql.Select() + .RawJoin("FULL JOIN UserGroup b ON b.id = a.GroupId") + .Where((a, b) => a.IsDeleted == false) + .ToSql((a, b) => new + { + user = a, group = b + }); + sql1 = sql1.Replace("INNER JOIN ", "FULL JOIN "); + + fsql.UseJsonMap(); @@ -384,6 +452,14 @@ namespace base_entity var sqlat = sqlatb.ToSql(); var sqlatr = sqlatb.ExecuteAffrows(); + var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); + var sqlatca1 = sqlatc1.ToSql(); + var sqlatcr1 = sqlatc1.ExecuteAffrows(); + + var sqlatc2 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2021-3-8 15:00:13")); + var sqlatca2 = sqlatc2.ToSql(); + var sqlatcr2 = sqlatc2.ExecuteAffrows(); + var sqlatc = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); var sqlatca = sqlatc.ToSql(); var sqlatcr = sqlatc.ExecuteAffrows(); @@ -452,6 +528,10 @@ namespace base_entity var sqls501 = sqls5.ToSql(); var sqls502 = sqls5.ToList(); + var sqls6 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime); + var sqls601 = sqls6.ToSql(); + var sqls602 = sqls6.ToList(); + fsql.Aop.AuditValue += new EventHandler((_, e) => { diff --git a/Examples/base_entity/base_entity.csproj b/Examples/base_entity/base_entity.csproj index aab00eea..6f286bbd 100644 --- a/Examples/base_entity/base_entity.csproj +++ b/Examples/base_entity/base_entity.csproj @@ -13,6 +13,7 @@ + @@ -21,6 +22,7 @@ + diff --git a/Examples/orm_vs/Program.cs b/Examples/orm_vs/Program.cs index 262b9816..f1259d36 100644 --- a/Examples/orm_vs/Program.cs +++ b/Examples/orm_vs/Program.cs @@ -28,17 +28,25 @@ namespace orm_vs static SqlSugarClient sugar { - get => new SqlSugarClient(new ConnectionConfig() + get { - //ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20", - //DbType = DbType.SqlServer, - ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20", - DbType = DbType.MySql, - //ConnectionString = "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=21", - //DbType = DbType.PostgreSQL, - IsAutoCloseConnection = true, - InitKeyType = InitKeyType.Attribute - }); + var db = new SqlSugarClient(new ConnectionConfig() + { + //ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20", + //DbType = DbType.SqlServer, + ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20", + DbType = DbType.MySql, + //ConnectionString = "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=21", + //DbType = DbType.PostgreSQL, + IsAutoCloseConnection = true, + InitKeyType = InitKeyType.Attribute + }); + db.Aop.OnLogExecuting = (sql, pars) => + { + Console.WriteLine(sql);//输出sql,查看执行sql + }; + return db; + } } class SongContext : DbContext @@ -83,6 +91,12 @@ namespace orm_vs var sql222 = fsql.Select().Where(a => DateTime.Now.Subtract(a.create_time.Value).TotalHours > 0).ToSql(); + var conModels = new List(); + conModels.Add(new ConditionalModel { FieldName = "`id` = 1 or 1=1; delete from song_tag; -- ", ConditionalType = ConditionalType.Equal, FieldValue = "1" }); + + var student = sugar.Queryable().Where(conModels).ToList(); + + #region ET test ////var t31 = fsql.Select().ToList(); //fsql.Select().First(); diff --git a/Examples/orm_vs/Properties/launchSettings.json b/Examples/orm_vs/Properties/launchSettings.json deleted file mode 100644 index 33504c94..00000000 --- a/Examples/orm_vs/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "WSL": { - "commandName": "WSL2", - "distributionName": "" - } - } -} \ No newline at end of file diff --git a/Examples/orm_vs/orm_vs.csproj b/Examples/orm_vs/orm_vs.csproj index a7a240e4..08ab5687 100644 --- a/Examples/orm_vs/orm_vs.csproj +++ b/Examples/orm_vs/orm_vs.csproj @@ -10,7 +10,7 @@ - + @@ -20,10 +20,4 @@ - - - ..\..\..\..\..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.entityframeworkcore\2.2.0\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll - - - diff --git a/Extensions/FreeSql.Generator/ConsoleApp.cs b/Extensions/FreeSql.Generator/ConsoleApp.cs index aebdef8b..bbeed9a0 100644 --- a/Extensions/FreeSql.Generator/ConsoleApp.cs +++ b/Extensions/FreeSql.Generator/ConsoleApp.cs @@ -90,7 +90,7 @@ new Colorful.Formatter("v" + string.Join(".", typeof(ConsoleApp).Assembly.GetNam -Razor 1 * 选择模板:实体类+特性 -Razor 2 * 选择模板:实体类+特性+导航属性 - -Razor ""d:\diy.cshtml"" * 自定义模板文件 + -Razor ""d:\diy.cshtml"" * 自定义模板文件,如乱码请修改为UTF8(不带BOM)编码格式 -NameOptions * 4个布尔值对应: 首字母大写 @@ -152,7 +152,7 @@ new Colorful.Formatter("推荐在实体类目录创建 gen.bat,双击它重新 { case "1": ArgsRazor = RazorContentManager.实体类_特性_cshtml; break; case "2": ArgsRazor = RazorContentManager.实体类_特性_导航属性_cshtml; break; - default: ArgsRazor = File.ReadAllText(args[a + 1]); break; + default: ArgsRazor = File.ReadAllText(args[a + 1], Encoding.UTF8); break; } a++; break; diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index d822afc3..13533430 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -328,7 +328,8 @@ namespace FreeSql } break; case Internal.Model.TableRefType.OneToMany: - var addlist = isAdd ? new List() : null; + var addList = new List(); + var addOrUpdateList = new List(); foreach (var propValItem in propValEach) { for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -336,10 +337,20 @@ namespace FreeSql var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val); } - if (isAdd) addlist.Add(propValItem); - else await refSet.AddOrUpdateAsync(propValItem, cancellationToken); + if (isAdd) addList.Add(propValItem); + else + { + var flagExists = refSet.ExistsInStates(propValItem); + if (flagExists == null) addList.Add(propValItem); //自增/Guid + else addOrUpdateList.Add(propValItem); //统一状态管理 + } + } + if (addList.Any()) await refSet.AddRangeAsync(addList, cancellationToken); + if (addOrUpdateList.Any()) + { + var existsList = await refSet.Select.WhereDynamic(addOrUpdateList).ToListAsync(false, cancellationToken); + foreach (var aouItem in addOrUpdateList) await refSet.AddOrUpdateAsync(aouItem, cancellationToken); } - if (isAdd) await refSet.AddRangeAsync(addlist, cancellationToken); break; } }; diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index d295033c..8bafd8ad 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -339,7 +339,8 @@ namespace FreeSql } break; case Internal.Model.TableRefType.OneToMany: - var addlist = isAdd ? new List() : null; + var addList = new List(); + var addOrUpdateList = new List(); foreach (var propValItem in propValEach) { for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -347,10 +348,20 @@ namespace FreeSql var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val); } - if (isAdd) addlist.Add(propValItem); - else refSet.AddOrUpdate(propValItem); + if (isAdd) addList.Add(propValItem); + else + { + var flagExists = refSet.ExistsInStates(propValItem); + if (flagExists == null) addList.Add(propValItem); //自增/Guid + else addOrUpdateList.Add(propValItem); //统一状态管理 + } + } + if (addList.Any()) refSet.AddRange(addList); + if (addOrUpdateList.Any()) + { + var existsList = refSet.Select.WhereDynamic(addOrUpdateList).ToList(); + foreach (var aouItem in addOrUpdateList) refSet.AddOrUpdate(aouItem); } - if (isAdd) refSet.AddRange(addlist); break; } }; diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 20d62ad1..16c38b48 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -581,7 +581,7 @@ 实体对象 属性名 - + 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 78c82be1..dd9e62f0 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -94,7 +94,7 @@ namespace FreeSql _dbset.RemoveRange(entitys); return _db.SaveChanges(); } - public List RemoveCascadeByDatabase(Expression> predicate) + public List DeleteCascadeByDatabase(Expression> predicate) { var list = _dbset.RemoveCascadeByDatabase(predicate); var affrows = _db.SaveChanges(); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs index 02a49839..c60dc03c 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs @@ -32,7 +32,7 @@ namespace FreeSql _dbset.RemoveRange(entitys); return _db.SaveChangesAsync(cancellationToken); } - async public virtual Task> RemoveCascadeByDatabaseAsync(Expression> predicate, CancellationToken cancellationToken = default) + async public virtual Task> DeleteCascadeByDatabaseAsync(Expression> predicate, CancellationToken cancellationToken = default) { var list = await _dbset.RemoveCascadeByDatabaseAsync(predicate, cancellationToken); var affrows = await _db.SaveChangesAsync(cancellationToken); diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index fa3c6fda..cecb57f8 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -90,7 +90,7 @@ namespace FreeSql /// /// /// - List RemoveCascadeByDatabase(Expression> predicate); + List DeleteCascadeByDatabase(Expression> predicate); /// /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行 @@ -122,7 +122,7 @@ namespace FreeSql Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default); Task DeleteAsync(IEnumerable entitys, CancellationToken cancellationToken = default); Task DeleteAsync(Expression> predicate, CancellationToken cancellationToken = default); - Task> RemoveCascadeByDatabaseAsync(Expression> predicate, CancellationToken cancellationToken = default); + Task> DeleteCascadeByDatabaseAsync(Expression> predicate, CancellationToken cancellationToken = default); #endif } diff --git a/FreeSql.Tests.VB/FreeSql.Tests.VB.vbproj b/FreeSql.Tests.VB/FreeSql.Tests.VB.vbproj index 82e4790d..56516b14 100644 --- a/FreeSql.Tests.VB/FreeSql.Tests.VB.vbproj +++ b/FreeSql.Tests.VB/FreeSql.Tests.VB.vbproj @@ -2,8 +2,7 @@ FreeSql.Tests.VB - net5.0 - + net6.0 false diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index 8c22404a..da9d1d2c 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -33,7 +33,7 @@ namespace FreeSql.Tests fsql.Delete().Where("1=1").ExecuteAffrows(); var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; userRepo.Insert(user); - var ret = userRepo.RemoveCascadeByDatabase(a => a.Id == user.Id); + var ret = userRepo.DeleteCascadeByDatabase(a => a.Id == user.Id); Assert.Equal(2, ret.Count); Assert.IsType(ret[0]); Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); @@ -64,7 +64,7 @@ namespace FreeSql.Tests fsql.Delete().Where("1=1").ExecuteAffrows(); user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; userRepo.Insert(user); - ret = userextRepo.RemoveCascadeByDatabase(a => a.UserId == user.UserExt.UserId); + ret = userextRepo.DeleteCascadeByDatabase(a => a.UserId == user.UserExt.UserId); Assert.Equal(2, ret.Count); Assert.IsType(ret[1]); Assert.Equal(user.UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); @@ -112,7 +112,7 @@ namespace FreeSql.Tests Assert.Equal(group.Id, group.Users[0].GroupId); Assert.Equal(group.Id, group.Users[1].GroupId); Assert.Equal(group.Id, group.Users[2].GroupId); - ret = groupRepo.RemoveCascadeByDatabase(a => a.Id == group.Id); + ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); Assert.Equal(7, ret.Count); Assert.IsType(ret[0]); Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); @@ -211,7 +211,7 @@ namespace FreeSql.Tests Assert.Equal(group.Id, group.Users[0].GroupId); Assert.Equal(group.Id, group.Users[1].GroupId); Assert.Equal(group.Id, group.Users[2].GroupId); - ret = groupRepo.RemoveCascadeByDatabase(a => a.Id == group.Id); + ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); Assert.Equal(18, ret.Count); Assert.IsType(ret[0]); diff --git a/FreeSql.Tests/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj b/FreeSql.Tests/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj index a646671e..f6d5e5b9 100644 --- a/FreeSql.Tests/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj +++ b/FreeSql.Tests/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj @@ -1,8 +1,7 @@  - net5.0 - + net6.0 false diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/FreeSql.Tests.Provider.GBase.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/FreeSql.Tests.Provider.GBase.csproj index a335a9cf..2c3189e6 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/FreeSql.Tests.Provider.GBase.csproj +++ b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/FreeSql.Tests.Provider.GBase.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/Curd/GBaseSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/Curd/GBaseSelectTest.cs index 1d538461..37261cdd 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/Curd/GBaseSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.GBase/GBase/Curd/GBaseSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -850,8 +850,8 @@ WHERE (exists(SELECT 1 all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, (SELECT sum(b.Id) - FROM tb_topic22 b) as6 + Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, nvl((SELECT sum(b.Id) + FROM tb_topic22 b), 0) as6 FROM tb_topic22 a", subquery); var subqueryList = select.ToList(a => new { @@ -867,8 +867,8 @@ FROM tb_topic22 a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, (SELECT min(b.Id) - FROM tb_topic22 b) as6 + Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, nvl((SELECT min(b.Id) + FROM tb_topic22 b), 0) as6 FROM tb_topic22 a", subquery); var subqueryList = select.ToList(a => new { @@ -884,8 +884,8 @@ FROM tb_topic22 a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, (SELECT max(b.Id) - FROM tb_topic22 b) as6 + Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, nvl((SELECT max(b.Id) + FROM tb_topic22 b), 0) as6 FROM tb_topic22 a", subquery); var subqueryList = select.ToList(a => new { @@ -901,8 +901,8 @@ FROM tb_topic22 a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, (SELECT avg(b.Id) - FROM tb_topic22 b) as6 + Assert.Equal(@"SELECT a.Id as1, a.Clicks as2, a.TypeGuid as3, a.Title as4, a.CreateTime as5, nvl((SELECT avg(b.Id) + FROM tb_topic22 b), 0) as6 FROM tb_topic22 a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/FreeSql.Tests.Provider.MySqlConnector.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/FreeSql.Tests.Provider.MySqlConnector.csproj index b2798928..68bbb01a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/FreeSql.Tests.Provider.MySqlConnector.csproj +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/FreeSql.Tests.Provider.MySqlConnector.csproj @@ -1,8 +1,7 @@  - net5.0;netcoreapp3.1; - + net6.0;netcoreapp3.1; false diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs index c499d3ba..78454478 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs @@ -1070,8 +1070,8 @@ limit 0,10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT sum(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT sum(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1087,8 +1087,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT min(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT min(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1104,8 +1104,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT max(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT max(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1121,8 +1121,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT avg(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT avg(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs index 9c9e6c52..37c0e095 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -822,7 +822,7 @@ namespace FreeSql.Tests.Odbc.Dameng public void OrderByRandom() { var t1 = select.OrderByRandom().Limit(10).ToSql("1"); - Assert.Equal(@"SELECT t.* FROM (SELECT 1 + Assert.Equal(@"SELECT t.* FROM (SELECT 1 FROM ""TB_TOPIC22"" a ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); var t2 = select.OrderByRandom().Limit(10).ToList(); @@ -864,8 +864,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -881,8 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -898,8 +898,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -915,8 +915,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1018,12 +1018,12 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); query.ToList(); query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql("count(1) as1").Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); query.Count(); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs index e83eb917..5769d1ba 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -829,8 +829,8 @@ namespace FreeSql.Tests.Odbc.Default all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT sum(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT sum(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -846,8 +846,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT min(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT min(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -863,8 +863,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT max(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT max(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -880,8 +880,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT avg(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT avg(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.csproj index c6dc638d..f739f01e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.csproj +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.csproj @@ -1,8 +1,7 @@  - net5.0 - + net6.0 false diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs index 1750d697..e0499fe2 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -830,8 +830,8 @@ limit 10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -847,8 +847,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -864,8 +864,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -881,8 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs index 3e6cd9b9..443742d0 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -950,8 +950,8 @@ limit 0,10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT sum(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT sum(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -967,8 +967,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT min(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT min(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -984,8 +984,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT max(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT max(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1001,8 +1001,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT avg(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT avg(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs index 75f2e3e3..cdabead1 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -823,7 +823,7 @@ namespace FreeSql.Tests.Odbc.Oracle public void OrderByRandom() { var t1 = select.OrderByRandom().Limit(10).ToSql("1"); - Assert.Equal(@"SELECT t.* FROM (SELECT 1 + Assert.Equal(@"SELECT t.* FROM (SELECT 1 FROM ""TB_TOPIC22"" a ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); var t2 = select.OrderByRandom().Limit(10).ToList(); @@ -865,8 +865,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -882,8 +882,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -899,8 +899,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -916,13 +916,13 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); - var subqueryList = select.ToList(a => new + var subqueryList = select.Limit(10).ToList(a => new { all = a, - count = select.As("b").Avg(b => b.Id) + count = select.As("b").Limit(10).Avg(b => b.Id) }); } [Fact] @@ -1019,12 +1019,12 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); query.ToList(); query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql("count(1) as1").Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); query.Count(); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs index a3c6b50c..85584f3b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -926,8 +926,8 @@ limit 10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT sum(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT sum(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -943,8 +943,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT min(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT min(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -960,8 +960,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT max(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT max(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -977,8 +977,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT avg(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT avg(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs index c539a808..157539af 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs @@ -820,8 +820,8 @@ ORDER BY newid()", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT sum(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT sum(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -837,8 +837,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT min(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT min(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -854,8 +854,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT max(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT max(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -871,8 +871,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT avg(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT avg(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj index 651c636c..f4b9be84 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj +++ b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj @@ -1,8 +1,7 @@  - net5.0 - + net6.0 false @@ -12,6 +11,7 @@ + diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs index 5fd6226e..a099fb50 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using NetTopologySuite.Geometries; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -11,7 +11,9 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Numerics; using System.Text; +using System.Text.RegularExpressions; using Xunit; namespace FreeSql.Tests.PostgreSQL.NetTopologySuite @@ -19,11 +21,65 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite public class PostgreSQLCodeFirstTest { + [Fact] + public void UInt256Crud2() + { + var fsql = g.pgsql; + fsql.Aop.AuditDataReader += (_, e) => + { + var dbtype = e.DataReader.GetDataTypeName(e.Index); + var m = Regex.Match(dbtype, @"numeric\((\d+)\)", RegexOptions.IgnoreCase); + if (m.Success && int.Parse(m.Groups[1].Value) > 19) + e.Value = e.DataReader.GetFieldValue(e.Index); //否则会报溢出错误 + }; + + var num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968"); + fsql.Delete().Where("1=1").ExecuteAffrows(); + Assert.Equal(1, fsql.Insert(new tuint256tb_01()).ExecuteAffrows()); + var find = fsql.Select().ToList(); + Assert.Single(find); + Assert.Equal("0", find[0].Number.ToString()); + var item = new tuint256tb_01 { Number = num }; + Assert.Equal(1, fsql.Insert(item).ExecuteAffrows()); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + Assert.Single(find); + Assert.Equal(item.Number, find[0].Number); + num = num - 1; + item.Number = num; + Assert.Equal(1, fsql.Update().SetSource(item).ExecuteAffrows()); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + Assert.Single(find); + Assert.Equal("57896044618658097711785492504343953926634992332820282019728792003956564819967", find[0].Number.ToString()); + + num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968"); + fsql.Delete().Where("1=1").ExecuteAffrows(); + Assert.Equal(1, fsql.Insert(new tuint256tb_01()).NoneParameter().ExecuteAffrows()); + find = fsql.Select().ToList(); + Assert.Single(find); + Assert.Equal("0", find[0].Number.ToString()); + item = new tuint256tb_01 { Number = num }; + Assert.Equal(1, fsql.Insert(item).NoneParameter().ExecuteAffrows()); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + Assert.Single(find); + Assert.Equal(item.Number, find[0].Number); + num = num - 1; + item.Number = num; + Assert.Equal(1, fsql.Update().NoneParameter().SetSource(item).ExecuteAffrows()); + find = fsql.Select().Where(a => a.Id == item.Id).ToList(); + Assert.Single(find); + Assert.Equal("57896044618658097711785492504343953926634992332820282019728792003956564819967", find[0].Number.ToString()); + } + class tuint256tb_01 + { + public Guid Id { get; set; } + public BigInteger Number { get; set; } + } + [Fact] public void GetComparisonDDLStatements() { var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements(); - Assert.True(string.IsNullOrEmpty(sql)); //κ + Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后 g.pgsql.Select(); } @@ -43,8 +99,8 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite var item2 = new TableAllType { - testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("")), - testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("й")), new BitArray(Encoding.UTF8.GetBytes("")) }, + testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")), + testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, testFieldBool = true, testFieldBoolArray = new[] { true, true, false, false }, testFieldBoolArrayNullable = new bool?[] { true, true, null, false, false }, @@ -53,8 +109,8 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite testFieldByteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6 }, testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 }, testFieldByteNullable = byte.MinValue, - testFieldBytes = Encoding.UTF8.GetBytes("й"), - testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("й"), Encoding.UTF8.GetBytes("й") }, + testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"), + testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") }, testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8), testFieldCidrArray = new[] { (IPAddress.Parse("10.0.0.0"), 8), (IPAddress.Parse("192.168.0.0"), 16) }, testFieldCidrArrayNullable = new (IPAddress, int)?[] { (IPAddress.Parse("10.0.0.0"), 8), null, (IPAddress.Parse("192.168.0.0"), 16) }, @@ -229,9 +285,9 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite testFieldShortArray = new short[] { 1, 2, 3, 4, 5 }, testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 }, testFieldShortNullable = short.MinValue, - testFieldString = "йstring'\\?!@#$%^&*()_+{}}{~?><<>", + testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>", testFieldChar = 'X', - testFieldStringArray = new[] { "йString1", "йString2", null, "йString3" }, + testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, testFieldTimeSpan = TimeSpan.FromDays(1), testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/FreeSql.Tests.Provider.Sqlite.Data.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/FreeSql.Tests.Provider.Sqlite.Data.csproj index 93061340..394d49c0 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/FreeSql.Tests.Provider.Sqlite.Data.csproj +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/FreeSql.Tests.Provider.Sqlite.Data.csproj @@ -3,7 +3,6 @@ net6.0 enable - false diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteSelectTest.cs index 15ac7fcc..ad048023 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteSelectTest.cs @@ -871,8 +871,8 @@ limit 0,10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT sum(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT sum(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -888,8 +888,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT min(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT min(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -905,8 +905,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT max(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT max(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -922,8 +922,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT avg(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT avg(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs index f384588e..11f712fb 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs @@ -955,7 +955,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1 public void OrderByRandom() { var t1 = select.OrderByRandom().Limit(10).ToSql("1"); - Assert.Equal(@"SELECT t.* FROM (SELECT 1 + Assert.Equal(@"SELECT t.* FROM (SELECT 1 FROM ""TB_TOPIC22"" a ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); var t2 = select.OrderByRandom().Limit(10).ToList(); @@ -997,8 +997,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1014,8 +1014,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1031,8 +1031,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1048,8 +1048,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1154,12 +1154,12 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); query.ToList(); query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql("count(1) as1").Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); query.Count(); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); diff --git a/FreeSql.Tests/FreeSql.Tests/ExpressionTree/GetDataReaderValueBlockExpressionTest.cs b/FreeSql.Tests/FreeSql.Tests/ExpressionTree/GetDataReaderValueBlockExpressionTest.cs index ee4873c3..d49235b1 100644 --- a/FreeSql.Tests/FreeSql.Tests/ExpressionTree/GetDataReaderValueBlockExpressionTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ExpressionTree/GetDataReaderValueBlockExpressionTest.cs @@ -1,14 +1,7 @@ -using FreeSql.DataAnnotations; -using FreeSql; +using FreeSql.Internal; using System; -using System.Collections.Generic; -using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using FreeSql.Internal; using System.Linq.Expressions; +using Xunit; namespace FreeSql.ExpressionTree { diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs index 63ca8372..c95cf88e 100644 --- a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs @@ -980,8 +980,8 @@ ORDER BY rand()", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -997,8 +997,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1014,8 +1014,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1031,8 +1031,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs new file mode 100644 index 00000000..c4194767 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Xunit; + +namespace FreeSql.Tests.Internal +{ + + public class CommonExpressionTest + { + [Fact] + public void IIFTest01() + { + var fsql = g.sqlite; + var sql = ""; + var sb = new StringBuilder(); + + sql = fsql.Select().Where(a => a.Bool == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1)", sql); + sql = fsql.Select().Where(a => a.Bool != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1)", sql); + sql = fsql.Select().Where(a => a.Bool == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => !a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1)", sql); + sql = fsql.Select().WhereCascade(a => a.Bool).Limit(10).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1) +limit 0,10", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1)", sql); + + sql = fsql.Select().Where(a => a.Bool == true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool != true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool == false && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => !a.Bool && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0)", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0)", sql); + + sql = fsql.Select().Where(a => a.Bool == true && a.Id > 0 && a.Bool == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1)", sql); + sql = fsql.Select().Where(a => a.Bool != true && a.Id > 0 && a.Bool != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1)", sql); + sql = fsql.Select().Where(a => a.Bool == false && a.Id > 0 && a.Bool == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => !a.Bool && a.Id > 0 && !a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => a.Bool && a.Id > 0 && a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1)", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1)", sql); + + // IIF + sql = fsql.Select().ToSql(a => a.Bool == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 && a.Bool == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 && a.Bool != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 && a.Bool == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 && !a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 && a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + } + + class IIFTest01Model + { + public int Id { get; set; } + public bool Bool { get; set; } + public bool? BoolNullable { get; set; } + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs index 85552bbf..c6354349 100644 --- a/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs @@ -1,23 +1,10 @@ -using FreeSql.DataAnnotations; -using FreeSql; -using System; -using System.Collections.Generic; -using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; +using FreeSql; using FreeSql.Internal; using FreeSql.Internal.CommonProvider; +using System; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using Xunit; namespace FreeSql.InternalTests { diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs index 0b6c087b..d7cb3d60 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs @@ -1,21 +1,4 @@ -using FreeSql.DataAnnotations; -using FreeSql; -using System; -using System.Collections.Generic; -using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; +using Xunit; namespace FreeSql.Tests.Issues { diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs index ba5b9681..cb05fd84 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs @@ -1,22 +1,8 @@ using FreeSql.DataAnnotations; -using FreeSql; -using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System.Collections.Generic; using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; -using Newtonsoft.Json; namespace FreeSql.Tests.Issues { diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/269.cs b/FreeSql.Tests/FreeSql.Tests/Issues/269.cs index 93e6165c..31aa74c0 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/269.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/269.cs @@ -1,21 +1,7 @@ using FreeSql.DataAnnotations; -using FreeSql; -using System; -using System.Collections.Generic; -using Xunit; using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; +using Xunit; namespace FreeSql.Tests.Issues { diff --git a/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs index 58e797a0..04dfaf18 100644 --- a/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -830,9 +830,8 @@ limit 10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b - limit 1) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -848,9 +847,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b - limit 1) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -866,9 +864,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b - limit 1) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -884,9 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b - limit 1) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/Linq/ExprHelperTest.cs b/FreeSql.Tests/FreeSql.Tests/Linq/ExprHelperTest.cs index eb479490..d51c771f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Linq/ExprHelperTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Linq/ExprHelperTest.cs @@ -1,22 +1,5 @@ -using FreeSql.DataAnnotations; -using FreeSql; -using System; -using System.Collections.Generic; +using System.Linq.Expressions; using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; -using FreeSql.Extensions.Linq; namespace FreeSql.Tests.Linq { diff --git a/FreeSql.Tests/FreeSql.Tests/Linq/QueryableRestoreToSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Linq/QueryableRestoreToSelectTest.cs index 3af1e098..33659ab7 100644 --- a/FreeSql.Tests/FreeSql.Tests/Linq/QueryableRestoreToSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Linq/QueryableRestoreToSelectTest.cs @@ -1,21 +1,7 @@ using FreeSql.DataAnnotations; -using FreeSql; -using System; using System.Collections.Generic; -using Xunit; using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; +using Xunit; namespace FreeSql.Tests.Linq { diff --git a/FreeSql.Tests/FreeSql.Tests/Linq/QueryableTest.cs b/FreeSql.Tests/FreeSql.Tests/Linq/QueryableTest.cs index 44ea5ddd..92353fb0 100644 --- a/FreeSql.Tests/FreeSql.Tests/Linq/QueryableTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Linq/QueryableTest.cs @@ -1,21 +1,9 @@ -using FreeSql.DataAnnotations; -using FreeSql; +using FreeSql; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; -using Xunit; using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; -using System.Diagnostics; -using System.IO; -using System.Text; +using Xunit; namespace FreeSql.Tests.Linq { diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs index 3c54d207..123b965d 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs @@ -945,8 +945,9 @@ WHERE (((a.[Name]) in (SELECT s.[Title] as as1 all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT sum(b.[Id]) - FROM [tb_topic22] b) as as6 + Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, iif(isnull((SELECT sum(b.[Id]) + FROM [tb_topic22] b)), 0, (SELECT sum(b.[Id]) + FROM [tb_topic22] b)) as as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -962,8 +963,9 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT min(b.[Id]) - FROM [tb_topic22] b) as as6 + Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, iif(isnull((SELECT min(b.[Id]) + FROM [tb_topic22] b)), 0, (SELECT min(b.[Id]) + FROM [tb_topic22] b)) as as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -979,8 +981,9 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT max(b.[Id]) - FROM [tb_topic22] b) as as6 + Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, iif(isnull((SELECT max(b.[Id]) + FROM [tb_topic22] b)), 0, (SELECT max(b.[Id]) + FROM [tb_topic22] b)) as as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -996,8 +999,9 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT avg(b.[Id]) - FROM [tb_topic22] b) as as6 + Assert.Equal(@"SELECT a.[Id] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, iif(isnull((SELECT avg(b.[Id]) + FROM [tb_topic22] b)), 0, (SELECT avg(b.[Id]) + FROM [tb_topic22] b)) as as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessExpression/StringTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessExpression/StringTest.cs index e4639294..4a0a063a 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessExpression/StringTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessExpression/StringTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -66,7 +66,7 @@ namespace FreeSql.Tests.MsAccessExpression [Fact] public void Format() { - var item = g.msaccess.GetRepository().Insert(new Topic { Clicks = 101, Title = "й101", CreateTime = DateTime.Parse("2020-7-5") }); + var item = g.msaccess.GetRepository().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") }); var sql = select.WhereDynamic(item).ToSql(a => new { str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}", @@ -89,9 +89,9 @@ WHERE (a.[Id] = {item.Id})", sql); [Fact] public void Format4() { - //3 {} ʱArguments Ƿֿ - //4 {} ʱArguments[1] ֻܽȻ NewArray [] - var item = g.msaccess.GetRepository().Insert(new Topic { Clicks = 101, Title = "й101", CreateTime = DateTime.Parse("2020-7-5") }); + //3个 {} 时,Arguments 解析出来是分开的 + //4个 {} 时,Arguments[1] 只能解析这个出来,然后里面是 NewArray [] + var item = g.msaccess.GetRepository().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") }); var sql = select.WhereDynamic(item).ToSql(a => new { str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}{a.Title}", @@ -249,6 +249,17 @@ WHERE (a.[Id] = {item.Id})", sql); //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 //FROM `tb_topic` a, `TestTypeInfo` a__Type //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`, '%')) + + var guid = Guid.NewGuid().ToString("N"); + var fsql = g.msaccess; + fsql.Insert(new Topic + { + Title = $"Test{guid}Contains01" + }).ExecuteAffrows(); + + var ret = fsql.Select().Where(a => a.Title.Contains(guid)).ToList(); + Assert.NotEmpty(ret); + Assert.Equal($"Test{guid}Contains01", ret[0].Title); } [Fact] public void ToLower() @@ -683,7 +694,7 @@ WHERE (a.[Id] = {item.Id})", sql); [Fact] public void Replace() { - //System.Data.OleDb.OleDbException : ʽ 'replace' δ塣 + //System.Data.OleDb.OleDbException : 表达式中 'replace' 函数未定义。 //var data = new List(); //data.Add(select.Where(a => a.Title.Replace("a", "b") == "aaa").ToList()); //data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c") == a.Title).ToList()); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index b5443e37..d7887030 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -1133,8 +1133,8 @@ limit 0,10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT sum(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT sum(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1150,8 +1150,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT min(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT min(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1167,8 +1167,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT max(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT max(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { @@ -1184,8 +1184,8 @@ FROM `tb_topic` a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, (SELECT avg(b.`Id`) - FROM `tb_topic` b) as6 + Assert.Equal(@"SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5, ifnull((SELECT avg(b.`Id`) + FROM `tb_topic` b), 0) as6 FROM `tb_topic` a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 6169e7b6..d61770fe 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -942,7 +942,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1 public void OrderByRandom() { var t1 = select.OrderByRandom().Limit(10).ToSql("1"); - Assert.Equal(@"SELECT t.* FROM (SELECT 1 + Assert.Equal(@"SELECT t.* FROM (SELECT 1 FROM ""TB_TOPIC22"" a ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); var t2 = select.OrderByRandom().Limit(10).ToList(); @@ -984,8 +984,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT sum(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1001,8 +1001,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT min(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1018,8 +1018,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT max(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1035,8 +1035,8 @@ FROM ""TB_TOPIC22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC22"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, nvl((SELECT avg(b.""ID"") + FROM ""TB_TOPIC22"" b), 0) as6 FROM ""TB_TOPIC22"" a", subquery); var subqueryList = select.Limit(10).ToList(a => new { @@ -1138,12 +1138,12 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql().Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql); query.ToList(); query = select.AsTable((_, old) => old).AsTable((_, old) => old); sql = query.ToSql("count(1) as1").Replace("\r\n", ""); - Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); + Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALL SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql); query.Count(); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 341fe856..18d8208a 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -1074,8 +1074,8 @@ limit 10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT sum(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT sum(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1091,8 +1091,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT min(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT min(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1108,8 +1108,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT max(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT max(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1125,8 +1125,8 @@ FROM ""tb_topic"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, (SELECT avg(b.""id"") - FROM ""tb_topic"" b) as6 + Assert.Equal(@"SELECT a.""id"" as1, a.""clicks"" as2, a.""typeguid"" as3, a.""title"" as4, a.""createtime"" as5, coalesce((SELECT avg(b.""id"") + FROM ""tb_topic"" b), 0) as6 FROM ""tb_topic"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs index 25615b65..a790dee9 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs @@ -1,5 +1,4 @@ -using FreeSql.DataAnnotations; -using Newtonsoft.Json; +using FreeSql.DataAnnotations; using Newtonsoft.Json.Linq; using Npgsql; using Npgsql.LegacyPostgis; @@ -11,6 +10,7 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Numerics; using System.Text; using Xunit; @@ -18,12 +18,13 @@ namespace FreeSql.Tests.PostgreSQL { public class PostgreSQLCodeFirstTest { + [Fact] public void InsertUpdateParameter() { var fsql = g.pgsql; fsql.CodeFirst.SyncStructure(); - var item = new ts_iupstr { id = Guid.NewGuid(), title = string.Join(",", Enumerable.Range(0, 2000).Select(a => "й")) }; + var item = new ts_iupstr { id = Guid.NewGuid(), title = string.Join(",", Enumerable.Range(0, 2000).Select(a => "我是中国人")) }; Assert.Equal(1, fsql.Insert(item).ExecuteAffrows()); var find = fsql.Select().Where(a => a.id == item.id).First(); Assert.NotNull(find); @@ -91,7 +92,7 @@ namespace FreeSql.Tests.PostgreSQL [Fact] public void Blob() { - var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); var data1 = Encoding.UTF8.GetBytes(str1); var item1 = new TS_BLB01 { Data = data1 }; @@ -137,57 +138,57 @@ namespace FreeSql.Tests.PostgreSQL } [Fact] - public void ı_ֶ() + public void 中文表_字段() { - var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<ı>(); - g.pgsql.CodeFirst.SyncStructure<ı>(); + var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<测试中文表>(); + g.pgsql.CodeFirst.SyncStructure<测试中文表>(); - var item = new ı + var item = new 测试中文表 { - = "Ա", - ʱ = DateTime.Now + 标题 = "测试标题", + 创建时间 = DateTime.Now }; - Assert.Equal(1, g.pgsql.Insert<ı>().AppendData(item).ExecuteAffrows()); - Assert.NotEqual(Guid.Empty, item.); - var item2 = g.pgsql.Select<ı>().Where(a => a. == item.).First(); + Assert.Equal(1, g.pgsql.Insert<测试中文表>().AppendData(item).ExecuteAffrows()); + Assert.NotEqual(Guid.Empty, item.编号); + var item2 = g.pgsql.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); Assert.NotNull(item2); - Assert.Equal(item., item2.); - Assert.Equal(item., item2.); + Assert.Equal(item.编号, item2.编号); + Assert.Equal(item.标题, item2.标题); - item. = "Ա"; - Assert.Equal(1, g.pgsql.Update<ı>().SetSource(item).ExecuteAffrows()); - item2 = g.pgsql.Select<ı>().Where(a => a. == item.).First(); + item.标题 = "测试标题更新"; + Assert.Equal(1, g.pgsql.Update<测试中文表>().SetSource(item).ExecuteAffrows()); + item2 = g.pgsql.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); Assert.NotNull(item2); - Assert.Equal(item., item2.); - Assert.Equal(item., item2.); + Assert.Equal(item.编号, item2.编号); + Assert.Equal(item.标题, item2.标题); - item. = "Ա_repo"; - var repo = g.pgsql.GetRepository<ı>(); + item.标题 = "测试标题更新_repo"; + var repo = g.pgsql.GetRepository<测试中文表>(); Assert.Equal(1, repo.Update(item)); - item2 = g.pgsql.Select<ı>().Where(a => a. == item.).First(); + item2 = g.pgsql.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); Assert.NotNull(item2); - Assert.Equal(item., item2.); - Assert.Equal(item., item2.); + Assert.Equal(item.编号, item2.编号); + Assert.Equal(item.标题, item2.标题); - item. = "Ա_repo22"; + item.标题 = "测试标题更新_repo22"; Assert.Equal(1, repo.Update(item)); - item2 = g.pgsql.Select<ı>().Where(a => a. == item.).First(); + item2 = g.pgsql.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); Assert.NotNull(item2); - Assert.Equal(item., item2.); - Assert.Equal(item., item2.); + Assert.Equal(item.编号, item2.编号); + Assert.Equal(item.标题, item2.标题); } - class ı + class 测试中文表 { [Column(IsPrimary = true)] - public Guid { get; set; } + public Guid 编号 { get; set; } - public string { get; set; } + public string 标题 { get; set; } [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] - public DateTime ʱ { get; set; } + public DateTime 创建时间 { get; set; } [Column(ServerTime = DateTimeKind.Local)] - public DateTime ʱ { get; set; } + public DateTime 更新时间 { get; set; } } [Fact] @@ -215,7 +216,7 @@ namespace FreeSql.Tests.PostgreSQL public void AddField() { var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements(); - Assert.True(string.IsNullOrEmpty(sql)); //κ + Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后 g.pgsql.Select(); var id = g.pgsql.Insert().AppendData(new TopicAddField { }).ExecuteIdentity(); } @@ -259,8 +260,6 @@ namespace FreeSql.Tests.PostgreSQL [Fact] public void CurdAllField() { - NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis(); - var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql(); var sql2 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql(); @@ -271,8 +270,8 @@ namespace FreeSql.Tests.PostgreSQL var item2 = new TableAllType { - testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("")), - testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("й")), new BitArray(Encoding.UTF8.GetBytes("")) }, + testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")), + testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, testFieldBool = true, testFieldBoolArray = new[] { true, true, false, false }, testFieldBoolArrayNullable = new bool?[] { true, true, null, false, false }, @@ -281,8 +280,8 @@ namespace FreeSql.Tests.PostgreSQL testFieldByteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6 }, testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 }, testFieldByteNullable = byte.MinValue, - testFieldBytes = Encoding.UTF8.GetBytes("й"), - testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("й"), Encoding.UTF8.GetBytes("й") }, + testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"), + testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") }, testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8), testFieldCidrArray = new[] { (IPAddress.Parse("10.0.0.0"), 8), (IPAddress.Parse("192.168.0.0"), 16) }, testFieldCidrArrayNullable = new (IPAddress, int)?[] { (IPAddress.Parse("10.0.0.0"), 8), null, (IPAddress.Parse("192.168.0.0"), 16) }, @@ -457,9 +456,9 @@ namespace FreeSql.Tests.PostgreSQL testFieldShortArray = new short[] { 1, 2, 3, 4, 5 }, testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 }, testFieldShortNullable = short.MinValue, - testFieldString = "йstring'\\?!@#$%^&*()_+{}}{~?><<>", + testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>", testFieldChar = 'X', - testFieldStringArray = new[] { "йString1", "йString2", null, "йString3" }, + testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, testFieldTimeSpan = TimeSpan.FromDays(1), testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index 62792d53..5642db33 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -1,12 +1,10 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using Newtonsoft.Json.Linq; -using Npgsql; using Npgsql.LegacyPostgis; using NpgsqlTypes; using System; using System.Collections; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Net; using System.Net.NetworkInformation; @@ -19,11 +17,6 @@ namespace FreeSql.Tests.PostgreSQLExpression ISelect select => g.pgsql.Select(); - public OtherTest() - { - NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis(); - } - [Fact] public void Div() { diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs index c199031a..fe432b60 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -944,8 +944,8 @@ limit 10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT sum(b.""ID"") - FROM ""TB_TOPIC"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT sum(b.""ID"") + FROM ""TB_TOPIC"" b), 0) as6 FROM ""TB_TOPIC"" a", subquery); var subqueryList = select.ToList(a => new { @@ -961,8 +961,8 @@ FROM ""TB_TOPIC"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT min(b.""ID"") - FROM ""TB_TOPIC"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT min(b.""ID"") + FROM ""TB_TOPIC"" b), 0) as6 FROM ""TB_TOPIC"" a", subquery); var subqueryList = select.ToList(a => new { @@ -978,8 +978,8 @@ FROM ""TB_TOPIC"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT max(b.""ID"") - FROM ""TB_TOPIC"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT max(b.""ID"") + FROM ""TB_TOPIC"" b), 0) as6 FROM ""TB_TOPIC"" a", subquery); var subqueryList = select.ToList(a => new { @@ -995,8 +995,8 @@ FROM ""TB_TOPIC"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT avg(b.""ID"") - FROM ""TB_TOPIC"" b) as6 + Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, coalesce((SELECT avg(b.""ID"") + FROM ""TB_TOPIC"" b), 0) as6 FROM ""TB_TOPIC"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index cbe5c814..1928d412 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -981,8 +981,8 @@ ORDER BY newid()", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT sum(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT sum(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -998,8 +998,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT min(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT min(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -1015,8 +1015,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT max(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT max(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { @@ -1032,8 +1032,8 @@ FROM [tb_topic22] a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, (SELECT avg(b.[Id]) - FROM [tb_topic22] b) as6 + Assert.Equal(@"SELECT a.[Id] as1, a.[Clicks] as2, a.[TypeGuid] as3, a.[Title] as4, a.[CreateTime] as5, isnull((SELECT avg(b.[Id]) + FROM [tb_topic22] b), 0) as6 FROM [tb_topic22] a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs index 70cfb014..4890f04b 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using FreeSql.Tests.DataContext.SqlServer; using System; using System.Collections.Generic; diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index a9b3f59b..81f463e9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -1003,8 +1003,8 @@ limit 0,10", t1); all = a, count = (long)select.As("b").Sum(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT sum(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT sum(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1020,8 +1020,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Min(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT min(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT min(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1037,8 +1037,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Max(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT max(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT max(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { @@ -1054,8 +1054,8 @@ FROM ""tb_topic22"" a", subquery); all = a, count = select.As("b").Avg(b => b.Id) }); - Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, (SELECT avg(b.""Id"") - FROM ""tb_topic22"" b) as6 + Assert.Equal(@"SELECT a.""Id"" as1, a.""Clicks"" as2, a.""TypeGuid"" as3, a.""Title"" as4, a.""CreateTime"" as5, ifnull((SELECT avg(b.""Id"") + FROM ""tb_topic22"" b), 0) as6 FROM ""tb_topic22"" a", subquery); var subqueryList = select.ToList(a => new { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs index 9562a3c6..03241025 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -79,6 +79,7 @@ namespace FreeSql.Tests.SqliteExpression var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList(); var testlinq2list = new string[] { }; var testlinq2 = g.sqlite.Delete().Where(a => testlinq2list.Contains(a.String)).ToSql(); + Assert.Equal("DELETE FROM \"tb_alltype\" WHERE (((\"String\") in (NULL)))", testlinq2); //in not in var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index 6d0e168b..a70df98d 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -1,22 +1,16 @@ using FreeSql.DataAnnotations; -using FreeSql; +using Newtonsoft.Json; using System; -using System.Collections.Generic; -using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; using System.Collections; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; +using Xunit; using Zeus; using Zeus.Domain.Enum; -using System.ComponentModel.DataAnnotations; -using System.Reflection; -using System.Threading; -using Newtonsoft.Json; namespace FreeSql.Tests { diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index 1526cddf..c1c64f53 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -1,19 +1,13 @@ -using FreeSql.DataAnnotations; -using FreeSql; +using FreeSql; +using FreeSql.DataAnnotations; +using kwlib; +using Microsoft.Data.SqlClient; using System; using System.Collections.Generic; -using Xunit; using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; using System.Threading; -using Microsoft.Data.SqlClient; -using kwlib; -using System.Text; +using Xunit; namespace FreeSql.Tests { diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 0fdc8193..a4405d35 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -1,25 +1,13 @@ -using FreeSql.DataAnnotations; -using FreeSql; +using FreeSql; +using FreeSql.DataAnnotations; +using kwlib; using System; using System.Collections.Generic; -using Xunit; -using System.Linq; -using Newtonsoft.Json.Linq; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -using System.Linq.Expressions; -using System.Threading.Tasks; -using System.ComponentModel.DataAnnotations; -using System.Threading; -using System.Data.SqlClient; -using kwlib; using System.Diagnostics; -using System.IO; +using System.Linq; using System.Text; -using Newtonsoft.Json; -using System.Net.NetworkInformation; -using System.Net; -using System.Collections; +using System.Threading; +using Xunit; namespace FreeSql.Tests { diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index 7b35a6ed..bcaf6b70 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -206,36 +206,24 @@ namespace FreeSql.DataAnnotations { return _dicRegSqlWhereDateTimes.GetOrAdd($"{columnName},{quoteParameterName}", cn => { - cn = columnName.Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\."); + cn = columnName.Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\.").Replace("?", "\\?"); + var qpn = quoteParameterName.Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\.").Replace("?", "\\?"); return new[] { - //new Regex($@"({cn}\s*(<|<=|>|>=|=|between)\s*)(datetime|cdate|to_date)\(('[^']+')\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))to_timestamp\(('[^']+')\s*,\s*'YYYY-MM-DD[^']+'\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))cast\(('[^']+') as (datetime|timestamp)\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))('[^']+')::(datetime|timestamp)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(between)\s+'[^']+'\s+and\s+)(datetime|cdate|to_date)\(('[^']+')\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(between)\s+'[^']+'\s+and(\s+))to_timestamp\(('[^']+')\s*,\s*'YYYY-MM-DD[^']+'\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(between)\s+'[^']+'\s+and(\s+))cast\(('[^']+') as (datetime|timestamp)\)", RegexOptions.IgnoreCase), - //new Regex($@"({cn}\s*(between)\s+'[^']+'\s+and(\s+))('[^']+')::(datetime|timestamp)", RegexOptions.IgnoreCase), - - new Regex($@"({cn}\s*(<|<=|>|>=|=)\s*)(datetime|cdate|to_date)\(({quoteParameterName}[\w_]+)\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(<|<=|>|>=|=)(\s*))to_timestamp\(({quoteParameterName}[\w_]+)\s*,\s*'YYYY-MM-DD[^']+'\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(<|<=|>|>=|=)(\s*))cast\(({quoteParameterName}[^w_]+) as (datetime|timestamp)\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(<|<=|>|>=|=)(\s*))({quoteParameterName}[^w_]+)::(datetime|timestamp)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(between)\s+{quoteParameterName}[\w_]+\s+and\s+)(datetime|cdate|to_date)\(({quoteParameterName}[\w_]+)\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(between)\s+{quoteParameterName}[\w_]+\s+and(\s+))to_timestamp\(({quoteParameterName}[\w_]+)\s*,\s*'YYYY-MM-DD[^']+'\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(between)\s+{quoteParameterName}[\w_]+\s+and(\s+))cast\(({quoteParameterName}[^w_]+) as (datetime|timestamp)\)", RegexOptions.IgnoreCase), - new Regex($@"({cn}\s*(between)\s+{quoteParameterName}[\w_]+\s+and(\s+))({quoteParameterName}[^w_]+)::(datetime|timestamp)", RegexOptions.IgnoreCase), - + new Regex($@"(\s*)(datetime|cdate|to_date)(\s*)\(\s*({qpn}[\w_]+)\s*\)", RegexOptions.IgnoreCase), + new Regex($@"(\s*)(to_timestamp)(\s*)\(\s*({qpn}[\w_]+)\s*,\s*{qpn}[\w_]+\s*\)", RegexOptions.IgnoreCase), + new Regex($@"(\s*)(cast)(\s*)\(\s*({qpn}[^w_]+)\s+as\s+(datetime|timestamp)\s*\)", RegexOptions.IgnoreCase), + new Regex($@"({qpn}[^w_]+)(\s*)(::)(\s*)(datetime|timestamp)", RegexOptions.IgnoreCase), + new Regex($@"(\s*)(timestamp)(\s*)({qpn}[\w_]+)", RegexOptions.IgnoreCase), //firebird new Regex($@"{cn}\s*between\s*'([^']+)'\s*and\s*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用 - new Regex($@"{cn}\s*between\s*{quoteParameterName}([\w_]+)\s*and\s*{quoteParameterName}([\w_]+)", RegexOptions.IgnoreCase), + new Regex($@"{cn}\s*between\s*{qpn}([\w_]+)\s*and\s*{qpn}([\w_]+)", RegexOptions.IgnoreCase), new Regex($@"{cn}\s*(<|<=|>|>=)\s*'([^']+)'\s*and\s*{cn}\s*(<|<=|>|>=)\s*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用 - new Regex($@"{cn}\s*(<|<=|>|>=)\s*{quoteParameterName}([\w_]+)\s*and\s*{cn}\s*(<|<=|>|>=)\s*{quoteParameterName}([\w_]+)", RegexOptions.IgnoreCase), + new Regex($@"{cn}\s*(<|<=|>|>=)\s*{qpn}([\w_]+)\s*and\s*{cn}\s*(<|<=|>|>=)\s*{qpn}([\w_]+)", RegexOptions.IgnoreCase), - new Regex($@"{cn}\s*(<|<=|>|>=)\s*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用 - new Regex($@"{cn}\s*(<|<=|>|>=)\s*{quoteParameterName}([\w_]+)", RegexOptions.IgnoreCase), + new Regex($@"{cn}\s*(=|<|<=|>|>=)\s*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用 + new Regex($@"{cn}\s*(=|<|<=|>|>=)\s*{qpn}([\w_]+)", RegexOptions.IgnoreCase), }; }); } @@ -265,16 +253,16 @@ namespace FreeSql.DataAnnotations //var tsqlWhere = Utils.ParseSqlWhereLevel1(sqlWhere); var regs = GetRegSqlWhereDateTimes($"{(string.IsNullOrWhiteSpace(tb.Alias) ? "" : $"{tb.Alias}.")}{commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name)}", quoteParameterName); - for (var a = 0; a < 8; a++) newSqlWhere = regs[a].Replace(newSqlWhere, "$1$4"); + for (var a = 0; a < 5; a++) newSqlWhere = regs[a].Replace(newSqlWhere, "$1$4"); - //var m = regs[8].Match(newSqlWhere); + //var m = regs[5].Match(newSqlWhere); //if (m.Success) return GetTableNamesByColumnValueRange(m.Groups[1].Value, m.Groups[2].Value); - //m = m = regs[10].Match(newSqlWhere); + //m = m = regs[7].Match(newSqlWhere); //if (m.Success) return LocalGetTables(m.Groups[1].Value, m.Groups[3].Value, ParseColumnValue(m.Groups[2].Value), ParseColumnValue(m.Groups[4].Value)); - //m = regs[12].Match(newSqlWhere); + //m = regs[9].Match(newSqlWhere); //if (m.Success) return LocalGetTables2(m.Groups[1].Value, ParseColumnValue(m.Groups[2].Value)); - var m = regs[9].Match(newSqlWhere); + var m = regs[6].Match(newSqlWhere); if (m.Success) { var val1 = LocalGetParamValue(m.Groups[1].Value); @@ -282,7 +270,7 @@ namespace FreeSql.DataAnnotations if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere)); return GetTableNamesByColumnValueRange(val1, val2); } - m = regs[11].Match(newSqlWhere); + m = regs[8].Match(newSqlWhere); if (m.Success) { var val1 = LocalGetParamValue(m.Groups[2].Value); @@ -290,7 +278,7 @@ namespace FreeSql.DataAnnotations if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere)); return LocalGetTables(m.Groups[1].Value, m.Groups[3].Value, ParseColumnValue(val1), ParseColumnValue(val2)); } - m = regs[13].Match(newSqlWhere); + m = regs[10].Match(newSqlWhere); if (m.Success) { var val1 = LocalGetParamValue(m.Groups[2].Value); @@ -349,6 +337,8 @@ namespace FreeSql.DataAnnotations { switch (m.Groups[1].Value) { + case "=": + return GetTableNamesByColumnValueRange(val1, val1); case "<": val1 = val1.AddSeconds(-1); return GetTableNamesByColumnValueRange(_beginTime, val1); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5d426896..1d32bd1f 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2609,11 +2609,19 @@ - 按聚合条件过滤,Where(a => a.Count() > 10) + 按聚合条件过滤,Having(a => a.Count() > 10) lambda表达式 + + + 按聚合条件过滤,HavingIf(true, a => a.Count() > 10) + + true 时生效 + lambda表达式 + + 按列排序,OrderBy(a => a.Time) diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index c787cc61..3f081a79 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -19,11 +19,18 @@ namespace FreeSql #endif /// - /// 按聚合条件过滤,Where(a => a.Count() > 10) + /// 按聚合条件过滤,Having(a => a.Count() > 10) /// /// lambda表达式 /// ISelectGrouping Having(Expression, bool>> exp); + /// + /// 按聚合条件过滤,HavingIf(true, a => a.Count() > 10) + /// + /// true 时生效 + /// lambda表达式 + /// + ISelectGrouping HavingIf(bool condition, Expression, bool>> exp); /// /// 按列排序,OrderBy(a => a.Time) diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index bac132d4..8977c56e 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -760,7 +760,9 @@ namespace FreeSql.Internal var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null); if (condExp.Test.IsParameter()) { - var conditionalTestSql = ExpressionLambdaToSql(condExp.Test, tsc); + var condExp2 = condExp.Test; + if (condExp2.NodeType == ExpressionType.MemberAccess) condExp2 = Expression.Equal(condExp2, Expression.Constant(true)); + var conditionalTestSql = ExpressionLambdaToSql(condExp2, tsc); tsc.SetMapTypeReturnOld(conditionalTestOldMapType); var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc)); tsc.SetMapTypeReturnOld(null); @@ -1265,7 +1267,7 @@ namespace FreeSql.Internal var sql4 = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({fieldSql})" })?.ToString(); asSelectBefores.Clear(); - return $"({sql4.Replace(" \r\n", " \r\n ")})"; + return _common.IsNull($"({sql4.Replace(" \r\n", " \r\n ")})", 0); } var sql3 = manySubSelectAggMethod.Invoke(fsql, new object[] { exp3Args0, FieldAliasOptions.AsProperty }) as string; @@ -1320,7 +1322,7 @@ namespace FreeSql.Internal exp3Args0 = new ReplaceHzyTupleToMultiParam().Modify(exp3Args0, fsqltables); var sqlSum = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3Args0, tscClone1)})" })?.ToString(); if (string.IsNullOrEmpty(sqlSum) == false) - return $"({sqlSum.Replace(" \r\n", " \r\n ")})"; + return _common.IsNull($"({sqlSum.Replace(" \r\n", " \r\n ")})", 0); break; case "ToList": case "ToOne": @@ -1965,7 +1967,33 @@ namespace FreeSql.Internal return; } exp3tmp = exp3Stack.Pop(); - if (exp3tmp.NodeType != ExpressionType.Parameter) return; + if (exp3tmp.NodeType != ExpressionType.Parameter) + { + //if (e.Expression.NodeType == ExpressionType.Call) + //{ + // var rootExpCall = e.Expression as MethodCallExpression; + // if (rootExpCall.Object == null && rootExpCall.Method.Name == "Any" && + // rootExpCall.Arguments.Count == 2 && + // rootExpCall.Arguments[0].Type.GetGenericTypeDefinition() == typeof(IEnumerable<>) && + // rootExpCall.Arguments[1].Type == typeof(Func<,>).MakeGenericType(rootExpCall.Arguments[0].Type.GetGenericArguments()[0], typeof(bool))) + // { + // //e.Tables[0].Parameter + // var anyExp = rootExpCall.Arguments[1]; + // while(anyExp.NodeType == ExpressionType.AndAlso) + // { + + // } + // if (anyExp.NodeType != ExpressionType.AndAlso && anyExp.NodeType != ExpressionType.Equal) return; + + + // var array = Expression.Lambda(rootExpCall.Arguments[0]).Compile().DynamicInvoke() as IEnumerable; + // foreach (var arritem in array) + // { + // } + // } + //} + return; + } if (exp3tmp.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate")) return; var commonExp = sender as FreeSql.Internal.CommonExpression; if (commonExp == null) return; @@ -2109,7 +2137,7 @@ namespace FreeSql.Internal commonExp.ReadAnonymousField(select._tables, field, map, ref index, callExp.Arguments[1], null, null, null, null, false); var fieldSql = field.Length > 0 ? field.Remove(0, 2).ToString() : null; - e.Result = $"({select.ToSql($"{aggregateMethodName}({fieldSql})").Replace(" \r\n", " \r\n ")})"; + e.Result = commonExp._common.IsNull($"({select.ToSql($"{aggregateMethodName}({fieldSql})").Replace(" \r\n", " \r\n ")})", 0); return; } throw throwCallExp($"不支持 {callExp.Arguments.Count}个参数的方法"); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 008dc329..102689fa 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -302,6 +302,11 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(sql)) return this as TSelect; _join.Append(" \r\n").Append(sql); + + //fsql.Select().RawJoin("FULL JOIN UserGroup b ON b.id = a.GroupId").ToSql((a, b) => new { user = a, group = b }); + foreach (var tb in _tables) + if (sql.Contains($" {tb.Table.DbName} ") || sql.Contains($" {_commonUtils.QuoteSqlName(tb.Table.DbName)} ")) + tb.Type = SelectTableInfoType.RawJoin; return this as TSelect; } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index d402ccbf..b95269db 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -993,7 +993,8 @@ namespace FreeSql.Internal.CommonProvider List midList = new List(); var tbref2 = _commonUtils.GetTableByEntity(tbref.RefEntityType); var tbrefMid = _commonUtils.GetTableByEntity(tbref.RefMiddleEntityType); - var sbJoin = new StringBuilder().Append($"{_commonUtils.QuoteSqlName(tbrefMid.DbName)} midtb ON "); + var tbrefMidName = _tableRules?.FirstOrDefault()?.Invoke(tbref.RefMiddleEntityType, tbrefMid.DbName) ?? tbrefMid.DbName; + var sbJoin = new StringBuilder().Append($"{_commonUtils.QuoteSqlName(tbrefMidName)} midtb ON "); for (var z = 0; z < tbref.RefColumns.Count; z++) { if (z > 0) sbJoin.Append(" AND "); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 6dff3907..d9b2bba3 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -226,6 +226,7 @@ namespace FreeSql.Internal.CommonProvider return this; } + public ISelectGrouping HavingIf(bool condition, Expression, bool>> exp) => condition ? Having(exp) : this; public ISelectGrouping Having(Expression, bool>> exp) { _lambdaParameter = exp?.Parameters[0]; diff --git a/FreeSql/Internal/Model/SelectTableInfo.cs b/FreeSql/Internal/Model/SelectTableInfo.cs index 346181dc..f288a583 100644 --- a/FreeSql/Internal/Model/SelectTableInfo.cs +++ b/FreeSql/Internal/Model/SelectTableInfo.cs @@ -24,5 +24,5 @@ namespace FreeSql.Internal.Model public string Cascade { get; set; } } - public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } + public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, RawJoin, Parent } } diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs index eb1bd06f..1cc335ea 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs @@ -154,7 +154,7 @@ namespace FreeSql.ClickHouse catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -184,7 +184,7 @@ namespace FreeSql.ClickHouse catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs index 0f018e6a..e3eef147 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.ClickHouse.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs index 41b9f7ca..dea03470 100644 --- a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs +++ b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Custom } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs index b78215b1..29d769ab 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs @@ -22,40 +22,40 @@ namespace FreeSql.Dameng.Curd tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); var sb = new StringBuilder(); + var sbunion = new StringBuilder(); + var sbnav = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) { if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); - if (tbUnionsGt0) sb.Append(_select).Append(" * from ("); var tbUnion = tbUnions[tbUnionsIdx]; - var sbnav = new StringBuilder(); - sb.Append(_select); - if (_distinct) sb.Append("DISTINCT "); - sb.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); - sb.Append(" \r\nFROM "); + sbunion.Append(_select); + if (_distinct) sbunion.Append("DISTINCT "); + sbunion.Append(field); + if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); for (var a = 0; a < tbsfrom.Length; a++) { - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); if (tbsjoin.Length > 0) { //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 for (var b = 1; b < tbsfrom.Length; b++) { - sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); + sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); else { var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); + sbunion.Append(" ON ").Append(onSql); if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); + if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); + else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); } } } @@ -67,28 +67,30 @@ namespace FreeSql.Dameng.Curd if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); } - if (a < tbsfrom.Length - 1) sb.Append(", "); + if (a < tbsfrom.Length - 1) sbunion.Append(", "); } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: - sb.Append(" \r\nLEFT JOIN "); + sbunion.Append(" \r\nLEFT JOIN "); break; case SelectTableInfoType.InnerJoin: - sb.Append(" \r\nINNER JOIN "); + sbunion.Append(" \r\nINNER JOIN "); break; case SelectTableInfoType.RightJoin: - sb.Append(" \r\nRIGHT JOIN "); + sbunion.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); + if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } - if (_join.Length > 0) sb.Append(_join); + if (_join.Length > 0) sbunion.Append(_join); sbnav.Append(_where); if (!string.IsNullOrEmpty(_tables[0].Cascade)) @@ -97,31 +99,39 @@ namespace FreeSql.Dameng.Curd if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); if (sbnav.Length > 0) - sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); + sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); if (string.IsNullOrEmpty(_groupby) == false) { - sb.Append(_groupby); + sbunion.Append(_groupby); if (string.IsNullOrEmpty(_having) == false) - sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); + sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5)); } - sb.Append(_orderby); + sbunion.Append(_orderby); if (string.IsNullOrEmpty(_orderby)) { if (_skip > 0) - sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); } else { - if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); - else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); - else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); + if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); + else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); } + if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb"); + sb.Append(sbunion); sbnav.Clear(); - if (tbUnionsGt0) sb.Append(") ftb"); + sbunion.Clear(); } - return sb.Append(_tosqlAppendContent).ToString(); + var sql = sb.Append(_tosqlAppendContent).ToString(); + + var aliasGreater30 = 0; + foreach (var tb in _tables) + if (tb.Alias.Length > 30) sql = sql.Replace(tb.Alias, $"than30_{aliasGreater30++}"); + + return sql; } public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } diff --git a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs index c7085cc2..709d0875 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs @@ -150,7 +150,7 @@ namespace FreeSql.Dameng catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -180,7 +180,7 @@ namespace FreeSql.Dameng catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/DmProvider.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/DmProvider.dll index 865630a9..a66f4386 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/DmProvider.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/DmProvider.dll differ diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/en/DmProvider.resources.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/en/DmProvider.resources.dll index c6ba0ef6..4d167724 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/en/DmProvider.resources.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/en/DmProvider.resources.dll differ diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/zh-CN/DmProvider.resources.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/zh-CN/DmProvider.resources.dll index 66bb2bee..96e6f539 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/zh-CN/DmProvider.resources.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/net40/zh-CN/DmProvider.resources.dll differ diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/DmProvider.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/DmProvider.dll index 7f92f586..d4db93cf 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/DmProvider.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/DmProvider.dll differ diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/en/DmProvider.resources.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/en/DmProvider.resources.dll index 93f83654..cb0e9488 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/en/DmProvider.resources.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/en/DmProvider.resources.dll differ diff --git a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/zh-CN/DmProvider.resources.dll b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/zh-CN/DmProvider.resources.dll index 0777d47d..fcd77075 100644 Binary files a/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/zh-CN/DmProvider.resources.dll and b/Providers/FreeSql.Provider.Dameng/lib/DmProvider/netstandard2.0/zh-CN/DmProvider.resources.dll differ diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs index a31791d0..e1358a4a 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Firebird.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs index 65961f26..afb4c3cc 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs @@ -134,7 +134,7 @@ namespace FreeSql.Firebird catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -164,7 +164,7 @@ namespace FreeSql.Firebird catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs index daf5a217..11740f7e 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.GBase.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 40a83f59..e4f5b0bc 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -28,7 +28,7 @@ - + diff --git a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs index 5c803c21..5f61046e 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs @@ -133,7 +133,7 @@ namespace FreeSql.GBase catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -163,7 +163,7 @@ namespace FreeSql.GBase catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs index 927a26cd..a54248f2 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.KingbaseES } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs index f5dec5c9..048119c9 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs @@ -155,7 +155,7 @@ namespace FreeSql.KingbaseES catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -185,7 +185,7 @@ namespace FreeSql.KingbaseES catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs index 9abd47c1..bea29f94 100644 --- a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs +++ b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs @@ -78,9 +78,11 @@ namespace FreeSql.MsAccess.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: if (ioinCounter++ > 0) sb.Insert(fromIndex, "(").Append(") "); sb.Append(" \r\nLEFT JOIN "); diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs index 0c019330..7ccc7f1b 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs @@ -138,7 +138,7 @@ namespace FreeSql.MsAccess catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -169,7 +169,7 @@ namespace FreeSql.MsAccess catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs index eb5177a0..8c2f0c0b 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.MySql.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 7ff174ee..1a8f125d 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -25,7 +25,7 @@ - + diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs index f9a6b7a7..ecde7d58 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs @@ -138,7 +138,7 @@ namespace FreeSql.MySql catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -168,7 +168,7 @@ namespace FreeSql.MySql catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs index 88b9d25d..7066b98b 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs @@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Dameng tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); var sb = new StringBuilder(); + var sbunion = new StringBuilder(); + var sbnav = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) { if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); - if (tbUnionsGt0) sb.Append(_select).Append(" * from ("); var tbUnion = tbUnions[tbUnionsIdx]; - var sbnav = new StringBuilder(); - sb.Append(_select); - if (_distinct) sb.Append("DISTINCT "); - sb.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); - sb.Append(" \r\nFROM "); + sbunion.Append(_select); + if (_distinct) sbunion.Append("DISTINCT "); + sbunion.Append(field); + if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); for (var a = 0; a < tbsfrom.Length; a++) { - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); if (tbsjoin.Length > 0) { //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 for (var b = 1; b < tbsfrom.Length; b++) { - sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); + sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); else { var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); + sbunion.Append(" ON ").Append(onSql); if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); + if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); + else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); } } } @@ -67,28 +67,30 @@ namespace FreeSql.Odbc.Dameng if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); } - if (a < tbsfrom.Length - 1) sb.Append(", "); + if (a < tbsfrom.Length - 1) sbunion.Append(", "); } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: - sb.Append(" \r\nLEFT JOIN "); + sbunion.Append(" \r\nLEFT JOIN "); break; case SelectTableInfoType.InnerJoin: - sb.Append(" \r\nINNER JOIN "); + sbunion.Append(" \r\nINNER JOIN "); break; case SelectTableInfoType.RightJoin: - sb.Append(" \r\nRIGHT JOIN "); + sbunion.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); + if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } - if (_join.Length > 0) sb.Append(_join); + if (_join.Length > 0) sbunion.Append(_join); sbnav.Append(_where); if (!string.IsNullOrEmpty(_tables[0].Cascade)) @@ -97,31 +99,39 @@ namespace FreeSql.Odbc.Dameng if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); if (sbnav.Length > 0) - sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); + sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); if (string.IsNullOrEmpty(_groupby) == false) { - sb.Append(_groupby); + sbunion.Append(_groupby); if (string.IsNullOrEmpty(_having) == false) - sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); + sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5)); } - sb.Append(_orderby); + sbunion.Append(_orderby); if (string.IsNullOrEmpty(_orderby)) { if (_skip > 0) - sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); } else { - if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); - else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); - else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); + if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); + else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); } + if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb"); + sb.Append(sbunion); sbnav.Clear(); - if (tbUnionsGt0) sb.Append(") ftb"); + sbunion.Clear(); } - return sb.Append(_tosqlAppendContent).ToString(); + var sql = sb.Append(_tosqlAppendContent).ToString(); + + var aliasGreater30 = 0; + foreach (var tb in _tables) + if (tb.Alias.Length > 30) sql = sql.Replace(tb.Alias, $"than30_{aliasGreater30++}"); + + return sql; } public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs index 76c2a573..d0570fed 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs @@ -155,7 +155,7 @@ namespace FreeSql.Odbc.Dameng catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -185,7 +185,7 @@ namespace FreeSql.Odbc.Dameng catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs index cb35af9b..292c933c 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs @@ -74,9 +74,11 @@ namespace FreeSql.Odbc.Default } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs index 783b2db9..86094ee0 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs @@ -139,7 +139,7 @@ namespace FreeSql.Odbc.Default catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -170,7 +170,7 @@ namespace FreeSql.Odbc.Default catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs index dece7c0a..0a3afbb3 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.KingbaseES } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs index 60010ae2..f9e989ff 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs @@ -155,7 +155,7 @@ namespace FreeSql.Odbc.KingbaseES catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -185,7 +185,7 @@ namespace FreeSql.Odbc.KingbaseES catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs index de181810..115dc0e6 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.MySql } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs index df2e22c7..e1b4ce1b 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs @@ -133,7 +133,7 @@ namespace FreeSql.Odbc.MySql catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -163,7 +163,7 @@ namespace FreeSql.Odbc.MySql catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs index 04f69ca7..54dd773c 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs @@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Oracle tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); var sb = new StringBuilder(); + var sbunion = new StringBuilder(); + var sbnav = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) { if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); - if (tbUnionsGt0) sb.Append(_select).Append(" * from ("); var tbUnion = tbUnions[tbUnionsIdx]; - var sbnav = new StringBuilder(); - sb.Append(_select); - if (_distinct) sb.Append("DISTINCT "); - sb.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); - sb.Append(" \r\nFROM "); + sbunion.Append(_select); + if (_distinct) sbunion.Append("DISTINCT "); + sbunion.Append(field); + if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); for (var a = 0; a < tbsfrom.Length; a++) { - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); if (tbsjoin.Length > 0) { //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 for (var b = 1; b < tbsfrom.Length; b++) { - sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); + sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); else { var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); + sbunion.Append(" ON ").Append(onSql); if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); + if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); + else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); } } } @@ -67,28 +67,30 @@ namespace FreeSql.Odbc.Oracle if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); } - if (a < tbsfrom.Length - 1) sb.Append(", "); + if (a < tbsfrom.Length - 1) sbunion.Append(", "); } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: - sb.Append(" \r\nLEFT JOIN "); + sbunion.Append(" \r\nLEFT JOIN "); break; case SelectTableInfoType.InnerJoin: - sb.Append(" \r\nINNER JOIN "); + sbunion.Append(" \r\nINNER JOIN "); break; case SelectTableInfoType.RightJoin: - sb.Append(" \r\nRIGHT JOIN "); + sbunion.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); + if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } - if (_join.Length > 0) sb.Append(_join); + if (_join.Length > 0) sbunion.Append(_join); sbnav.Append(_where); if (!string.IsNullOrEmpty(_tables[0].Cascade)) @@ -97,29 +99,31 @@ namespace FreeSql.Odbc.Oracle if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); if (sbnav.Length > 0) - sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); + sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); if (string.IsNullOrEmpty(_groupby) == false) { - sb.Append(_groupby); + sbunion.Append(_groupby); if (string.IsNullOrEmpty(_having) == false) - sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); + sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5)); } - sb.Append(_orderby); + sbunion.Append(_orderby); if (string.IsNullOrEmpty(_orderby)) { if (_skip > 0) - sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); } else { - if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); - else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); - else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); + if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); + else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); } + if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb"); + sb.Append(sbunion); sbnav.Clear(); - if (tbUnionsGt0) sb.Append(") ftb"); + sbunion.Clear(); } var sql = sb.Append(_tosqlAppendContent).ToString(); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs index 0da4b66a..7505b033 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs @@ -155,7 +155,7 @@ namespace FreeSql.Odbc.Oracle catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -185,7 +185,7 @@ namespace FreeSql.Odbc.Oracle catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs index 79677e82..14abbee6 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Odbc.PostgreSQL } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs index a6fb1096..638fe5b3 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs @@ -145,7 +145,7 @@ namespace FreeSql.Odbc.PostgreSQL catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -175,7 +175,7 @@ namespace FreeSql.Odbc.PostgreSQL catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 45c87130..eca1e5b7 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -90,9 +90,11 @@ namespace FreeSql.Odbc.SqlServer } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; @@ -195,9 +197,11 @@ namespace FreeSql.Odbc.SqlServer } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs index 70906e5a..745b924c 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs @@ -139,7 +139,7 @@ namespace FreeSql.Odbc.SqlServer catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -170,7 +170,7 @@ namespace FreeSql.Odbc.SqlServer catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs index 0a04eac5..636d961b 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs @@ -22,40 +22,40 @@ namespace FreeSql.Oracle.Curd tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); var sb = new StringBuilder(); + var sbunion = new StringBuilder(); + var sbnav = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) { if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); - if (tbUnionsGt0) sb.Append(_select).Append(" * from ("); var tbUnion = tbUnions[tbUnionsIdx]; - var sbnav = new StringBuilder(); - sb.Append(_select); - if (_distinct) sb.Append("DISTINCT "); - sb.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); - sb.Append(" \r\nFROM "); + sbunion.Append(_select); + if (_distinct) sbunion.Append("DISTINCT "); + sbunion.Append(field); + if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); for (var a = 0; a < tbsfrom.Length; a++) { - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); if (tbsjoin.Length > 0) { //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 for (var b = 1; b < tbsfrom.Length; b++) { - sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); + sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); else { var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); + sbunion.Append(" ON ").Append(onSql); if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); + if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); + else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); } } } @@ -67,28 +67,30 @@ namespace FreeSql.Oracle.Curd if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); } - if (a < tbsfrom.Length - 1) sb.Append(", "); + if (a < tbsfrom.Length - 1) sbunion.Append(", "); } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: - sb.Append(" \r\nLEFT JOIN "); + sbunion.Append(" \r\nLEFT JOIN "); break; case SelectTableInfoType.InnerJoin: - sb.Append(" \r\nINNER JOIN "); + sbunion.Append(" \r\nINNER JOIN "); break; case SelectTableInfoType.RightJoin: - sb.Append(" \r\nRIGHT JOIN "); + sbunion.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); + if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } - if (_join.Length > 0) sb.Append(_join); + if (_join.Length > 0) sbunion.Append(_join); sbnav.Append(_where); if (!string.IsNullOrEmpty(_tables[0].Cascade)) @@ -97,29 +99,31 @@ namespace FreeSql.Oracle.Curd if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); if (sbnav.Length > 0) - sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); + sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); if (string.IsNullOrEmpty(_groupby) == false) { - sb.Append(_groupby); + sbunion.Append(_groupby); if (string.IsNullOrEmpty(_having) == false) - sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); + sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5)); } - sb.Append(_orderby); + sbunion.Append(_orderby); if (string.IsNullOrEmpty(_orderby)) { if (_skip > 0) - sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); } else { - if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); - else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); - else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); + if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); + else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); + else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); } + if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb"); + sb.Append(sbunion); sbnav.Clear(); - if (tbUnionsGt0) sb.Append(") ftb"); + sbunion.Clear(); } var sql = sb.Append(_tosqlAppendContent).ToString(); diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 31683a01..2fc83fcd 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net60;net50;net45;net40 + netstandard2.0;netstandard2.1;net60;net50;net45;net40 true FreeSql;ncc;YeXiangQin FreeSql 数据库实现,基于 Oracle 11 @@ -28,11 +28,11 @@ - + - + diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs index 3af56509..68865e20 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs @@ -156,7 +156,7 @@ namespace FreeSql.Oracle catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -186,7 +186,7 @@ namespace FreeSql.Oracle catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs index 76df4935..aece7ca7 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.PostgreSQL.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index cce2e648..2708ac47 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -146,7 +146,7 @@ namespace FreeSql.PostgreSQL catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -176,7 +176,7 @@ namespace FreeSql.PostgreSQL catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs index 1d053470..da13e9de 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs @@ -10,6 +10,7 @@ using System.Data; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Numerics; using System.Text; using System.Text.RegularExpressions; @@ -47,6 +48,7 @@ namespace FreeSql.PostgreSQL { typeof(bool).FullName, CsToDb.New(NpgsqlDbType.Boolean, "bool","bool NOT NULL", null, false, false) },{ typeof(bool?).FullName, CsToDb.New(NpgsqlDbType.Boolean, "bool","bool", null, true, null) }, { typeof(Byte[]).FullName, CsToDb.New(NpgsqlDbType.Bytea, "bytea", "bytea", false, null, new byte[0]) }, { typeof(BitArray).FullName, CsToDb.New(NpgsqlDbType.Varbit, "varbit", "varbit(64)", false, null, new BitArray(new byte[64])) }, + { typeof(BigInteger).FullName, CsToDb.New(NpgsqlDbType.Numeric, "numeric", "numeric(78,0) NOT NULL", false, false, 0) },{ typeof(BigInteger?).FullName, CsToDb.New(NpgsqlDbType.Numeric, "numeric", "numeric(78,0)", false, true, null) }, { typeof(NpgsqlPoint).FullName, CsToDb.New(NpgsqlDbType.Point, "point", "point NOT NULL", false, false, new NpgsqlPoint(0, 0)) },{ typeof(NpgsqlPoint?).FullName, CsToDb.New(NpgsqlDbType.Point, "point", "point", false, true, null) }, { typeof(NpgsqlLine).FullName, CsToDb.New(NpgsqlDbType.Line, "line", "line NOT NULL", false, false, new NpgsqlLine(0, 0, 1)) },{ typeof(NpgsqlLine?).FullName, CsToDb.New(NpgsqlDbType.Line, "line", "line", false, true, null) }, diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs index b6ef1fba..b6fa8c05 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs @@ -3,12 +3,10 @@ using FreeSql.Internal; using Newtonsoft.Json.Linq; using Npgsql.LegacyPostgis; using NpgsqlTypes; -using FreeSql.Internal.ObjectPool; using System; using System.Collections; using System.Collections.Generic; using System.Data; -using System.Data.Common; using System.Linq; using System.Net; using System.Net.NetworkInformation; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index 3570378a..fe845f8b 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -12,6 +12,7 @@ using System.Data.Common; using System.Linq.Expressions; using System.Net; using System.Net.NetworkInformation; +using System.Numerics; using System.Reflection; using System.Threading; @@ -23,6 +24,7 @@ namespace FreeSql.PostgreSQL static PostgreSQLProvider() { + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; @@ -121,6 +123,14 @@ namespace FreeSql.PostgreSQL this.DbFirst = new PostgreSQLDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); this.CodeFirst = new PostgreSQLCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); + + //this.Aop.AuditDataReader += (_, e) => + //{ + // var dbtype = e.DataReader.GetDataTypeName(e.Index); + // var m = Regex.Match(dbtype, @"numeric\((\d+)\)", RegexOptions.IgnoreCase); + // if (m.Success && int.Parse(m.Groups[1].Value) > 19) + // e.Value = e.DataReader.GetFieldValue(e.Index); + //}; } ~PostgreSQLProvider() => this.Dispose(); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 89dd4343..2fb59508 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -12,6 +12,7 @@ using System.Data.Common; using System.Globalization; using System.Linq; using System.Net; +using System.Numerics; using System.Text; namespace FreeSql.PostgreSQL @@ -45,6 +46,7 @@ namespace FreeSql.PostgreSQL { typeof(byte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(byte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(byte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) }, { typeof(sbyte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(sbyte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(sbyte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) }, { typeof(char).FullName, a => string.Concat(a).Replace('\0', ' ').ToCharArray().FirstOrDefault() }, + { typeof(BigInteger).FullName, a => BigInteger.Parse(string.Concat(a), System.Globalization.NumberStyles.Any) }, { typeof(BigInteger[]).FullName, a => getParamterArrayValue(typeof(BigInteger), a, 0) }, { typeof(BigInteger?[]).FullName, a => getParamterArrayValue(typeof(BigInteger?), a, null) }, { typeof(NpgsqlPath).FullName, a => { var path = (NpgsqlPath)a; diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs index 36fbaca0..70772de1 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.ShenTong.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs index a375a4f7..cc63202a 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs @@ -144,7 +144,7 @@ namespace FreeSql.ShenTong catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -174,7 +174,7 @@ namespace FreeSql.ShenTong catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index bd1592b3..c045b3ec 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -90,9 +90,11 @@ namespace FreeSql.SqlServer.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; @@ -195,9 +197,11 @@ namespace FreeSql.SqlServer.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 76129798..06950324 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -28,7 +28,7 @@ - + diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index 32b12918..922d9ee9 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -144,7 +144,7 @@ namespace FreeSql.SqlServer catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -174,7 +174,7 @@ namespace FreeSql.SqlServer catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs index 30843855..9d597515 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs @@ -69,9 +69,11 @@ namespace FreeSql.Sqlite.Curd } foreach (var tb in tbsjoin) { - if (tb.Type == SelectTableInfoType.Parent) continue; switch (tb.Type) { + case SelectTableInfoType.Parent: + case SelectTableInfoType.RawJoin: + continue; case SelectTableInfoType.LeftJoin: sb.Append(" \r\nLEFT JOIN "); break; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs index 7ed19d00..f5677b1a 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -173,7 +173,7 @@ namespace FreeSql.Sqlite catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } @@ -203,7 +203,7 @@ namespace FreeSql.Sqlite catch (Exception ex) { if (_pool.SetUnavailable(ex) == true) - throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}"); + throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); } } } diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 9cb760af..2d15b6d1 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -29,7 +29,7 @@ - +