Merge main branches

This commit is contained in:
igeekfan 2022-05-20 03:16:13 +08:00
commit 747603dbb6
121 changed files with 1110 additions and 709 deletions

View File

@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<Version>3.2.606</Version> <Version>3.2.650-preview20220518</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -14,10 +14,12 @@ using System.Data.SQLite;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Numerics;
using System.Reflection; using System.Reflection;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -131,7 +133,7 @@ namespace base_entity
public string ShippingAddress { get; set; } public string ShippingAddress { get; set; }
} }
[Table(Name = "tb_TopicMapTypeToListDto")] [Table(Name = "tb_tmttld"), OraclePrimaryKeyName("TMTTLD_PK01")]
class TopicMapTypeToListDto class TopicMapTypeToListDto
{ {
[Column(IsIdentity = true, IsPrimary = true)] [Column(IsIdentity = true, IsPrimary = true)]
@ -158,8 +160,11 @@ namespace base_entity
public string Title { get; set; } public string Title { get; set; }
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
class tuint256tb_01
{
public Guid Id { get; set; }
public BigInteger Number { get; set; }
}
class CommandTimeoutCascade : IDisposable class CommandTimeoutCascade : IDisposable
{ {
public static AsyncLocal<int> _asyncLocalTimeout = new AsyncLocal<int>(); public static AsyncLocal<int> _asyncLocalTimeout = new AsyncLocal<int>();
@ -178,12 +183,15 @@ namespace base_entity
//.UseSlaveWeight(10, 1, 1, 5) //.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.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.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") //.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) //.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") //.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) //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
@ -208,6 +216,56 @@ namespace base_entity
BaseEntity.Initialization(fsql, () => _asyncUow.Value); BaseEntity.Initialization(fsql, () => _asyncUow.Value);
#endregion #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<BigInteger>(e.Index); //否则会报溢出错误
};
var num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968");
fsql.Delete<tuint256tb_01>().Where("1=1").ExecuteAffrows();
if (1 != fsql.Insert(new tuint256tb_01()).ExecuteAffrows()) throw new Exception("not equal");
var find = fsql.Select<tuint256tb_01>().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<tuint256tb_01>().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<tuint256tb_01>().SetSource(item).ExecuteAffrows()) throw new Exception("not equal");
find = fsql.Select<tuint256tb_01>().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<tuint256tb_01>().Where("1=1").ExecuteAffrows();
if (1 != fsql.Insert(new tuint256tb_01()).NoneParameter().ExecuteAffrows()) throw new Exception("not equal");
find = fsql.Select<tuint256tb_01>().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<tuint256tb_01>().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<tuint256tb_01>().NoneParameter().SetSource(item).ExecuteAffrows()) throw new Exception("not equal");
find = fsql.Select<tuint256tb_01>().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) => fsql.Aop.CommandBefore += (_, e) =>
{ {
if (CommandTimeoutCascade._asyncLocalTimeout.Value > 0) if (CommandTimeoutCascade._asyncLocalTimeout.Value > 0)
@ -222,6 +280,16 @@ namespace base_entity
} }
var sql1 = fsql.Select<User1, UserGroup>()
.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(); fsql.UseJsonMap();
@ -384,6 +452,14 @@ namespace base_entity
var sqlat = sqlatb.ToSql(); var sqlat = sqlatb.ToSql();
var sqlatr = sqlatb.ExecuteAffrows(); var sqlatr = sqlatb.ExecuteAffrows();
var sqlatc1 = fsql.Delete<AsTableLog>().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<AsTableLog>().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<AsTableLog>().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); var sqlatc = fsql.Delete<AsTableLog>().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1")));
var sqlatca = sqlatc.ToSql(); var sqlatca = sqlatc.ToSql();
var sqlatcr = sqlatc.ExecuteAffrows(); var sqlatcr = sqlatc.ExecuteAffrows();
@ -452,6 +528,10 @@ namespace base_entity
var sqls501 = sqls5.ToSql(); var sqls501 = sqls5.ToSql();
var sqls502 = sqls5.ToList(); var sqls502 = sqls5.ToList();
var sqls6 = fsql.Select<AsTableLog>().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<FreeSql.Aop.AuditValueEventArgs>((_, e) => fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) =>
{ {

View File

@ -13,6 +13,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Npgsql.NetTopologySuite" Version="6.0.4" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -21,6 +22,7 @@
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" /> <ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
<ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" /> <ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" />
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" /> <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Firebird\FreeSql.Provider.Firebird.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Odbc\FreeSql.Provider.Odbc.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.Odbc\FreeSql.Provider.Odbc.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj" />

View File

@ -28,17 +28,25 @@ namespace orm_vs
static SqlSugarClient sugar 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", var db = new SqlSugarClient(new ConnectionConfig()
//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", //ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20",
DbType = DbType.MySql, //DbType = DbType.SqlServer,
//ConnectionString = "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=21", 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.PostgreSQL, DbType = DbType.MySql,
IsAutoCloseConnection = true, //ConnectionString = "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=21",
InitKeyType = InitKeyType.Attribute //DbType = DbType.PostgreSQL,
}); IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql);//输出sql,查看执行sql
};
return db;
}
} }
class SongContext : DbContext class SongContext : DbContext
@ -83,6 +91,12 @@ namespace orm_vs
var sql222 = fsql.Select<Song>().Where(a => DateTime.Now.Subtract(a.create_time.Value).TotalHours > 0).ToSql(); var sql222 = fsql.Select<Song>().Where(a => DateTime.Now.Subtract(a.create_time.Value).TotalHours > 0).ToSql();
var conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel { FieldName = "`id` = 1 or 1=1; delete from song_tag; -- ", ConditionalType = ConditionalType.Equal, FieldValue = "1" });
var student = sugar.Queryable<Song>().Where(conModels).ToList();
#region ET test #region ET test
////var t31 = fsql.Select<xxx>().ToList(); ////var t31 = fsql.Select<xxx>().ToList();
//fsql.Select<Song>().First(); //fsql.Select<Song>().First();

View File

@ -1,8 +0,0 @@
{
"profiles": {
"WSL": {
"commandName": "WSL2",
"distributionName": ""
}
}
}

View File

@ -10,7 +10,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.0" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.0" />
<PackageReference Include="sqlSugarCore" Version="5.0.1.2" /> <PackageReference Include="sqlSugarCore" Version="5.0.8" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -20,10 +20,4 @@
<ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.EntityFrameworkCore">
<HintPath>..\..\..\..\..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.entityframeworkcore\2.2.0\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

View File

@ -90,7 +90,7 @@ new Colorful.Formatter("v" + string.Join(".", typeof(ConsoleApp).Assembly.GetNam
-Razor 1 * + -Razor 1 * +
-Razor 2 * ++ -Razor 2 * ++
-Razor ""d:\diy.cshtml"" * -Razor ""d:\diy.cshtml"" * UTF8(BOM)
-NameOptions * 4 -NameOptions * 4
@ -152,7 +152,7 @@ new Colorful.Formatter("推荐在实体类目录创建 gen.bat双击它重新
{ {
case "1": ArgsRazor = RazorContentManager._特性_cshtml; break; case "1": ArgsRazor = RazorContentManager._特性_cshtml; break;
case "2": 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++; a++;
break; break;

View File

@ -328,7 +328,8 @@ namespace FreeSql
} }
break; break;
case Internal.Model.TableRefType.OneToMany: case Internal.Model.TableRefType.OneToMany:
var addlist = isAdd ? new List<object>() : null; var addList = new List<object>();
var addOrUpdateList = new List<object>();
foreach (var propValItem in propValEach) foreach (var propValItem in propValEach)
{ {
for (var colidx = 0; colidx < tref.Columns.Count; colidx++) 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)); 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); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
} }
if (isAdd) addlist.Add(propValItem); if (isAdd) addList.Add(propValItem);
else await refSet.AddOrUpdateAsync(propValItem, cancellationToken); 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; break;
} }
}; };

View File

@ -339,7 +339,8 @@ namespace FreeSql
} }
break; break;
case Internal.Model.TableRefType.OneToMany: case Internal.Model.TableRefType.OneToMany:
var addlist = isAdd ? new List<object>() : null; var addList = new List<object>();
var addOrUpdateList = new List<object>();
foreach (var propValItem in propValEach) foreach (var propValItem in propValEach)
{ {
for (var colidx = 0; colidx < tref.Columns.Count; colidx++) 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)); 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); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
} }
if (isAdd) addlist.Add(propValItem); if (isAdd) addList.Add(propValItem);
else refSet.AddOrUpdate(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; break;
} }
}; };

View File

@ -581,7 +581,7 @@
<param name="entity">实体对象</param> <param name="entity">实体对象</param>
<param name="propertyName">属性名</param> <param name="propertyName">属性名</param>
</member> </member>
<member name="M:FreeSql.IBaseRepository`1.RemoveCascadeByDatabase(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})"> <member name="M:FreeSql.IBaseRepository`1.DeleteCascadeByDatabase(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary> <summary>
根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们
</summary> </summary>

View File

@ -94,7 +94,7 @@ namespace FreeSql
_dbset.RemoveRange(entitys); _dbset.RemoveRange(entitys);
return _db.SaveChanges(); return _db.SaveChanges();
} }
public List<object> RemoveCascadeByDatabase(Expression<Func<TEntity, bool>> predicate) public List<object> DeleteCascadeByDatabase(Expression<Func<TEntity, bool>> predicate)
{ {
var list = _dbset.RemoveCascadeByDatabase(predicate); var list = _dbset.RemoveCascadeByDatabase(predicate);
var affrows = _db.SaveChanges(); var affrows = _db.SaveChanges();

View File

@ -32,7 +32,7 @@ namespace FreeSql
_dbset.RemoveRange(entitys); _dbset.RemoveRange(entitys);
return _db.SaveChangesAsync(cancellationToken); return _db.SaveChangesAsync(cancellationToken);
} }
async public virtual Task<List<object>> RemoveCascadeByDatabaseAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default) async public virtual Task<List<object>> DeleteCascadeByDatabaseAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default)
{ {
var list = await _dbset.RemoveCascadeByDatabaseAsync(predicate, cancellationToken); var list = await _dbset.RemoveCascadeByDatabaseAsync(predicate, cancellationToken);
var affrows = await _db.SaveChangesAsync(cancellationToken); var affrows = await _db.SaveChangesAsync(cancellationToken);

View File

@ -90,7 +90,7 @@ namespace FreeSql
/// </summary> /// </summary>
/// <param name="predicate"></param> /// <param name="predicate"></param>
/// <returns></returns> /// <returns></returns>
List<object> RemoveCascadeByDatabase(Expression<Func<TEntity, bool>> predicate); List<object> DeleteCascadeByDatabase(Expression<Func<TEntity, bool>> predicate);
/// <summary> /// <summary>
/// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para> /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
@ -122,7 +122,7 @@ namespace FreeSql
Task<int> DeleteAsync(TEntity entity, CancellationToken cancellationToken = default); Task<int> DeleteAsync(TEntity entity, CancellationToken cancellationToken = default);
Task<int> DeleteAsync(IEnumerable<TEntity> entitys, CancellationToken cancellationToken = default); Task<int> DeleteAsync(IEnumerable<TEntity> entitys, CancellationToken cancellationToken = default);
Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default); Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default);
Task<List<object>> RemoveCascadeByDatabaseAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default); Task<List<object>> DeleteCascadeByDatabaseAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default);
#endif #endif
} }

View File

@ -2,8 +2,7 @@
<PropertyGroup> <PropertyGroup>
<RootNamespace>FreeSql.Tests.VB</RootNamespace> <RootNamespace>FreeSql.Tests.VB</RootNamespace>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -33,7 +33,7 @@ namespace FreeSql.Tests
fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } };
userRepo.Insert(user); 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.Equal(2, ret.Count);
Assert.IsType<DeleteCascadeUserExt>(ret[0]); Assert.IsType<DeleteCascadeUserExt>(ret[0]);
Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
@ -64,7 +64,7 @@ namespace FreeSql.Tests
fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } };
userRepo.Insert(user); 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.Equal(2, ret.Count);
Assert.IsType<DeleteCascadeUserExt>(ret[1]); Assert.IsType<DeleteCascadeUserExt>(ret[1]);
Assert.Equal(user.UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); 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[0].GroupId);
Assert.Equal(group.Id, group.Users[1].GroupId); Assert.Equal(group.Id, group.Users[1].GroupId);
Assert.Equal(group.Id, group.Users[2].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.Equal(7, ret.Count);
Assert.IsType<DeleteCascadeUserExt>(ret[0]); Assert.IsType<DeleteCascadeUserExt>(ret[0]);
Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); 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[0].GroupId);
Assert.Equal(group.Id, group.Users[1].GroupId); Assert.Equal(group.Id, group.Users[1].GroupId);
Assert.Equal(group.Id, group.Users[2].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.Equal(18, ret.Count);
Assert.IsType<DeleteCascadeUserExt>(ret[0]); Assert.IsType<DeleteCascadeUserExt>(ret[0]);

View File

@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -850,8 +850,8 @@ WHERE (exists(SELECT 1
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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) 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) as6 FROM tb_topic22 b), 0) as6
FROM tb_topic22 a", subquery); FROM tb_topic22 a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -867,8 +867,8 @@ FROM tb_topic22 a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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) 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) as6 FROM tb_topic22 b), 0) as6
FROM tb_topic22 a", subquery); FROM tb_topic22 a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -884,8 +884,8 @@ FROM tb_topic22 a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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) 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) as6 FROM tb_topic22 b), 0) as6
FROM tb_topic22 a", subquery); FROM tb_topic22 a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -901,8 +901,8 @@ FROM tb_topic22 a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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) 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) as6 FROM tb_topic22 b), 0) as6
FROM tb_topic22 a", subquery); FROM tb_topic22 a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net5.0;netcoreapp3.1;</TargetFrameworks> <TargetFrameworks>net6.0;netcoreapp3.1;</TargetFrameworks>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -1070,8 +1070,8 @@ limit 0,10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1087,8 +1087,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1104,8 +1104,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1121,8 +1121,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -822,7 +822,7 @@ namespace FreeSql.Tests.Odbc.Dameng
public void OrderByRandom() public void OrderByRandom()
{ {
var t1 = select.OrderByRandom().Limit(10).ToSql("1"); 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 FROM ""TB_TOPIC22"" a
ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
var t2 = select.OrderByRandom().Limit(10).ToList(); var t2 = select.OrderByRandom().Limit(10).ToList();
@ -864,8 +864,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -881,8 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -898,8 +898,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -915,8 +915,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new 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); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql().Replace("\r\n", ""); 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.ToList();
query = select.AsTable((_, old) => old).AsTable((_, old) => old); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql("count(1) as1").Replace("\r\n", ""); 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(); query.Count();
select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -829,8 +829,8 @@ namespace FreeSql.Tests.Odbc.Default
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -846,8 +846,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -863,8 +863,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -880,8 +880,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -830,8 +830,8 @@ limit 10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -847,8 +847,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -864,8 +864,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -881,8 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -950,8 +950,8 @@ limit 0,10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -967,8 +967,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -984,8 +984,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1001,8 +1001,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -823,7 +823,7 @@ namespace FreeSql.Tests.Odbc.Oracle
public void OrderByRandom() public void OrderByRandom()
{ {
var t1 = select.OrderByRandom().Limit(10).ToSql("1"); 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 FROM ""TB_TOPIC22"" a
ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
var t2 = select.OrderByRandom().Limit(10).ToList(); var t2 = select.OrderByRandom().Limit(10).ToList();
@ -865,8 +865,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -882,8 +882,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -899,8 +899,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -916,13 +916,13 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.Limit(10).ToList(a => new
{ {
all = a, all = a,
count = select.As("b").Avg(b => b.Id) count = select.As("b").Limit(10).Avg(b => b.Id)
}); });
} }
[Fact] [Fact]
@ -1019,12 +1019,12 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
query = select.AsTable((_, old) => old).AsTable((_, old) => old); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql().Replace("\r\n", ""); 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.ToList();
query = select.AsTable((_, old) => old).AsTable((_, old) => old); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql("count(1) as1").Replace("\r\n", ""); 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(); query.Count();
select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -926,8 +926,8 @@ limit 10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -943,8 +943,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -960,8 +960,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -977,8 +977,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -820,8 +820,8 @@ ORDER BY newid()", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -837,8 +837,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -854,8 +854,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -871,8 +871,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
@ -12,6 +11,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Npgsql.NetTopologySuite" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.0" />
<PackageReference Include="xunit" Version="2.4.1" /> <PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using NetTopologySuite.Geometries; using NetTopologySuite.Geometries;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -11,7 +11,9 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Numerics;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using Xunit; using Xunit;
namespace FreeSql.Tests.PostgreSQL.NetTopologySuite namespace FreeSql.Tests.PostgreSQL.NetTopologySuite
@ -19,11 +21,65 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite
public class PostgreSQLCodeFirstTest 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<BigInteger>(e.Index); //否则会报溢出错误
};
var num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968");
fsql.Delete<tuint256tb_01>().Where("1=1").ExecuteAffrows();
Assert.Equal(1, fsql.Insert(new tuint256tb_01()).ExecuteAffrows());
var find = fsql.Select<tuint256tb_01>().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<tuint256tb_01>().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<tuint256tb_01>().SetSource(item).ExecuteAffrows());
find = fsql.Select<tuint256tb_01>().Where(a => a.Id == item.Id).ToList();
Assert.Single(find);
Assert.Equal("57896044618658097711785492504343953926634992332820282019728792003956564819967", find[0].Number.ToString());
num = BigInteger.Parse("57896044618658097711785492504343953926634992332820282019728792003956564819968");
fsql.Delete<tuint256tb_01>().Where("1=1").ExecuteAffrows();
Assert.Equal(1, fsql.Insert(new tuint256tb_01()).NoneParameter().ExecuteAffrows());
find = fsql.Select<tuint256tb_01>().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<tuint256tb_01>().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<tuint256tb_01>().NoneParameter().SetSource(item).ExecuteAffrows());
find = fsql.Select<tuint256tb_01>().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] [Fact]
public void GetComparisonDDLStatements() public void GetComparisonDDLStatements()
{ {
var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<TableAllType>(); var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<TableAllType>();
Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后 Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后
g.pgsql.Select<TableAllType>(); g.pgsql.Select<TableAllType>();
} }
@ -43,8 +99,8 @@ namespace FreeSql.Tests.PostgreSQL.NetTopologySuite
var item2 = new TableAllType var item2 = new TableAllType
{ {
testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")), testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")),
testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) },
testFieldBool = true, testFieldBool = true,
testFieldBoolArray = new[] { true, true, false, false }, testFieldBoolArray = new[] { true, true, false, false },
testFieldBoolArrayNullable = new bool?[] { true, true, null, 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 }, testFieldByteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6 },
testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 }, testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 },
testFieldByteNullable = byte.MinValue, testFieldByteNullable = byte.MinValue,
testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"), testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"),
testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") }, testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") },
testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8), testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8),
testFieldCidrArray = new[] { (IPAddress.Parse("10.0.0.0"), 8), (IPAddress.Parse("192.168.0.0"), 16) }, 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) }, 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 }, testFieldShortArray = new short[] { 1, 2, 3, 4, 5 },
testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 }, testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 },
testFieldShortNullable = short.MinValue, testFieldShortNullable = short.MinValue,
testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>", testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>",
testFieldChar = 'X', testFieldChar = 'X',
testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" },
testFieldTimeSpan = TimeSpan.FromDays(1), testFieldTimeSpan = TimeSpan.FromDays(1),
testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) },
testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) },

View File

@ -3,7 +3,6 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>

View File

@ -871,8 +871,8 @@ limit 0,10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -888,8 +888,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -905,8 +905,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -922,8 +922,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -955,7 +955,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
public void OrderByRandom() public void OrderByRandom()
{ {
var t1 = select.OrderByRandom().Limit(10).ToSql("1"); 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 FROM ""TB_TOPIC22"" a
ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
var t2 = select.OrderByRandom().Limit(10).ToList(); var t2 = select.OrderByRandom().Limit(10).ToList();
@ -997,8 +997,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1014,8 +1014,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1031,8 +1031,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1048,8 +1048,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new 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); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql().Replace("\r\n", ""); 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.ToList();
query = select.AsTable((_, old) => old).AsTable((_, old) => old); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql("count(1) as1").Replace("\r\n", ""); 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(); query.Count();
select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);

View File

@ -1,14 +1,7 @@
using FreeSql.DataAnnotations; using FreeSql.Internal;
using FreeSql;
using System; 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 System.Linq.Expressions;
using Xunit;
namespace FreeSql.ExpressionTree namespace FreeSql.ExpressionTree
{ {

View File

@ -980,8 +980,8 @@ ORDER BY rand()", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -997,8 +997,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1014,8 +1014,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1031,8 +1031,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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<IIFTest01Model>().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; }
}
}
}

View File

@ -1,23 +1,10 @@
using FreeSql.DataAnnotations; using FreeSql;
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.Internal; using FreeSql.Internal;
using FreeSql.Internal.CommonProvider; using FreeSql.Internal.CommonProvider;
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Xunit;
namespace FreeSql.InternalTests namespace FreeSql.InternalTests
{ {

View File

@ -1,21 +1,4 @@
using FreeSql.DataAnnotations; using Xunit;
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;
namespace FreeSql.Tests.Issues namespace FreeSql.Tests.Issues
{ {

View File

@ -1,22 +1,8 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using FreeSql; using Newtonsoft.Json;
using System; using Newtonsoft.Json.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit; 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 namespace FreeSql.Tests.Issues
{ {

View File

@ -1,21 +1,7 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using FreeSql;
using System;
using System.Collections.Generic;
using Xunit;
using System.Linq; 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.Threading;
using System.Data.SqlClient; using Xunit;
using kwlib;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace FreeSql.Tests.Issues namespace FreeSql.Tests.Issues
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -830,9 +830,8 @@ limit 10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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 FROM ""TB_TOPIC22"" b), 0) as6
limit 1) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -848,9 +847,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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 FROM ""TB_TOPIC22"" b), 0) as6
limit 1) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -866,9 +864,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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 FROM ""TB_TOPIC22"" b), 0) as6
limit 1) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -884,9 +881,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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 FROM ""TB_TOPIC22"" b), 0) as6
limit 1) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,22 +1,5 @@
using FreeSql.DataAnnotations; using System.Linq.Expressions;
using FreeSql;
using System;
using System.Collections.Generic;
using Xunit; 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 namespace FreeSql.Tests.Linq
{ {

View File

@ -1,21 +1,7 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using FreeSql;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit;
using System.Linq; using System.Linq;
using Newtonsoft.Json.Linq; using Xunit;
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;
namespace FreeSql.Tests.Linq namespace FreeSql.Tests.Linq
{ {

View File

@ -1,21 +1,9 @@
using FreeSql.DataAnnotations; using FreeSql;
using FreeSql; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit;
using System.Linq; using System.Linq;
using Newtonsoft.Json.Linq; using Xunit;
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;
namespace FreeSql.Tests.Linq namespace FreeSql.Tests.Linq
{ {

View File

@ -945,8 +945,9 @@ WHERE (((a.[Name]) in (SELECT s.[Title] as as1
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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]) 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) as as6 FROM [tb_topic22] b)), 0, (SELECT sum(b.[Id])
FROM [tb_topic22] b)) as as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -962,8 +963,9 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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]) 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) as as6 FROM [tb_topic22] b)), 0, (SELECT min(b.[Id])
FROM [tb_topic22] b)) as as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -979,8 +981,9 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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]) 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) as as6 FROM [tb_topic22] b)), 0, (SELECT max(b.[Id])
FROM [tb_topic22] b)) as as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -996,8 +999,9 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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]) 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) as as6 FROM [tb_topic22] b)), 0, (SELECT avg(b.[Id])
FROM [tb_topic22] b)) as as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -66,7 +66,7 @@ namespace FreeSql.Tests.MsAccessExpression
[Fact] [Fact]
public void Format() public void Format()
{ {
var item = g.msaccess.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") }); var item = g.msaccess.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") });
var sql = select.WhereDynamic(item).ToSql(a => new var sql = select.WhereDynamic(item).ToSql(a => new
{ {
str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}", str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
@ -89,9 +89,9 @@ WHERE (a.[Id] = {item.Id})", sql);
[Fact] [Fact]
public void Format4() public void Format4()
{ {
//3个 {} 时Arguments 解析出来是分开的 //3个 {} 时Arguments 解析出来是分开的
//4个 {} 时Arguments[1] 只能解析这个出来,然后里面是 NewArray [] //4个 {} 时Arguments[1] 只能解析这个出来,然后里面是 NewArray []
var item = g.msaccess.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") }); var item = g.msaccess.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") });
var sql = select.WhereDynamic(item).ToSql(a => new var sql = select.WhereDynamic(item).ToSql(a => new
{ {
str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}{a.Title}", 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 //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 //FROM `tb_topic` a, `TestTypeInfo` a__Type
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`, '%')) //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<Topic>().Where(a => a.Title.Contains(guid)).ToList();
Assert.NotEmpty(ret);
Assert.Equal($"Test{guid}Contains01", ret[0].Title);
} }
[Fact] [Fact]
public void ToLower() public void ToLower()
@ -683,7 +694,7 @@ WHERE (a.[Id] = {item.Id})", sql);
[Fact] [Fact]
public void Replace() public void Replace()
{ {
//System.Data.OleDb.OleDbException : 表达式中 'replace' 函数未定义。 //System.Data.OleDb.OleDbException : 表达式中 'replace' 函数未定义。
//var data = new List<object>(); //var data = new List<object>();
//data.Add(select.Where(a => a.Title.Replace("a", "b") == "aaa").ToList()); //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()); //data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c") == a.Title).ToList());

View File

@ -1133,8 +1133,8 @@ limit 0,10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1150,8 +1150,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1167,8 +1167,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1184,8 +1184,8 @@ FROM `tb_topic` a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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`) 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) as6 FROM `tb_topic` b), 0) as6
FROM `tb_topic` a", subquery); FROM `tb_topic` a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -942,7 +942,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
public void OrderByRandom() public void OrderByRandom()
{ {
var t1 = select.OrderByRandom().Limit(10).ToSql("1"); 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 FROM ""TB_TOPIC22"" a
ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1); ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
var t2 = select.OrderByRandom().Limit(10).ToList(); var t2 = select.OrderByRandom().Limit(10).ToList();
@ -984,8 +984,8 @@ ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1001,8 +1001,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1018,8 +1018,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1035,8 +1035,8 @@ FROM ""TB_TOPIC22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC22"" b), 0) as6
FROM ""TB_TOPIC22"" a", subquery); FROM ""TB_TOPIC22"" a", subquery);
var subqueryList = select.Limit(10).ToList(a => new 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); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql().Replace("\r\n", ""); 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.ToList();
query = select.AsTable((_, old) => old).AsTable((_, old) => old); query = select.AsTable((_, old) => old).AsTable((_, old) => old);
sql = query.ToSql("count(1) as1").Replace("\r\n", ""); 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(); query.Count();
select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id); select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);

View File

@ -1074,8 +1074,8 @@ limit 10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1091,8 +1091,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1108,8 +1108,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1125,8 +1125,8 @@ FROM ""tb_topic"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""tb_topic"" b), 0) as6
FROM ""tb_topic"" a", subquery); FROM ""tb_topic"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,5 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Npgsql; using Npgsql;
using Npgsql.LegacyPostgis; using Npgsql.LegacyPostgis;
@ -11,6 +10,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Numerics;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -18,12 +18,13 @@ namespace FreeSql.Tests.PostgreSQL
{ {
public class PostgreSQLCodeFirstTest public class PostgreSQLCodeFirstTest
{ {
[Fact] [Fact]
public void InsertUpdateParameter() public void InsertUpdateParameter()
{ {
var fsql = g.pgsql; var fsql = g.pgsql;
fsql.CodeFirst.SyncStructure<ts_iupstr_bak>(); fsql.CodeFirst.SyncStructure<ts_iupstr_bak>();
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()); Assert.Equal(1, fsql.Insert(item).ExecuteAffrows());
var find = fsql.Select<ts_iupstr>().Where(a => a.id == item.id).First(); var find = fsql.Select<ts_iupstr>().Where(a => a.id == item.id).First();
Assert.NotNull(find); Assert.NotNull(find);
@ -91,7 +92,7 @@ namespace FreeSql.Tests.PostgreSQL
[Fact] [Fact]
public void Blob() 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 data1 = Encoding.UTF8.GetBytes(str1);
var item1 = new TS_BLB01 { Data = data1 }; var item1 = new TS_BLB01 { Data = data1 };
@ -137,57 +138,57 @@ namespace FreeSql.Tests.PostgreSQL
} }
[Fact] [Fact]
public void _字段() public void _字段()
{ {
var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<>(); var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<>();
g.pgsql.CodeFirst.SyncStructure<>(); g.pgsql.CodeFirst.SyncStructure<>();
var item = new var item = new
{ {
= "测试标题", = "测试标题",
= DateTime.Now = DateTime.Now
}; };
Assert.Equal(1, g.pgsql.Insert<>().AppendData(item).ExecuteAffrows()); Assert.Equal(1, g.pgsql.Insert<>().AppendData(item).ExecuteAffrows());
Assert.NotEqual(Guid.Empty, item.); Assert.NotEqual(Guid.Empty, item.);
var item2 = g.pgsql.Select<>().Where(a => a. == item.).First(); var item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新"; item. = "测试标题更新";
Assert.Equal(1, g.pgsql.Update<>().SetSource(item).ExecuteAffrows()); Assert.Equal(1, g.pgsql.Update<>().SetSource(item).ExecuteAffrows());
item2 = g.pgsql.Select<>().Where(a => a. == item.).First(); item2 = g.pgsql.Select<>().Where(a => a. == item.).First();
Assert.NotNull(item2); Assert.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
item. = "测试标题更新_repo"; item. = "测试标题更新_repo";
var repo = g.pgsql.GetRepository<>(); var repo = g.pgsql.GetRepository<>();
Assert.Equal(1, repo.Update(item)); 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.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)); 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.NotNull(item2);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
Assert.Equal(item., item2.); Assert.Equal(item., item2.);
} }
class class
{ {
[Column(IsPrimary = true)] [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)] [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
public DateTime { get; set; } public DateTime { get; set; }
[Column(ServerTime = DateTimeKind.Local)] [Column(ServerTime = DateTimeKind.Local)]
public DateTime { get; set; } public DateTime { get; set; }
} }
[Fact] [Fact]
@ -215,7 +216,7 @@ namespace FreeSql.Tests.PostgreSQL
public void AddField() public void AddField()
{ {
var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<TopicAddField>(); var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements<TopicAddField>();
Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后 Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后
g.pgsql.Select<TopicAddField>(); g.pgsql.Select<TopicAddField>();
var id = g.pgsql.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteIdentity(); var id = g.pgsql.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteIdentity();
} }
@ -259,8 +260,6 @@ namespace FreeSql.Tests.PostgreSQL
[Fact] [Fact]
public void CurdAllField() public void CurdAllField()
{ {
NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis();
var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql(); var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql();
var sql2 = 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 var item2 = new TableAllType
{ {
testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")), testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")),
testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) },
testFieldBool = true, testFieldBool = true,
testFieldBoolArray = new[] { true, true, false, false }, testFieldBoolArray = new[] { true, true, false, false },
testFieldBoolArrayNullable = new bool?[] { true, true, null, 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 }, testFieldByteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6 },
testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 }, testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 },
testFieldByteNullable = byte.MinValue, testFieldByteNullable = byte.MinValue,
testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"), testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"),
testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") }, testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("我是中国人"), Encoding.UTF8.GetBytes("我是中国人") },
testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8), testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8),
testFieldCidrArray = new[] { (IPAddress.Parse("10.0.0.0"), 8), (IPAddress.Parse("192.168.0.0"), 16) }, 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) }, 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 }, testFieldShortArray = new short[] { 1, 2, 3, 4, 5 },
testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 }, testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 },
testFieldShortNullable = short.MinValue, testFieldShortNullable = short.MinValue,
testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>", testFieldString = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>",
testFieldChar = 'X', testFieldChar = 'X',
testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" },
testFieldTimeSpan = TimeSpan.FromDays(1), testFieldTimeSpan = TimeSpan.FromDays(1),
testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) },
testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) },

View File

@ -1,12 +1,10 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Npgsql;
using Npgsql.LegacyPostgis; using Npgsql.LegacyPostgis;
using NpgsqlTypes; using NpgsqlTypes;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
@ -19,11 +17,6 @@ namespace FreeSql.Tests.PostgreSQLExpression
ISelect<TableAllType> select => g.pgsql.Select<TableAllType>(); ISelect<TableAllType> select => g.pgsql.Select<TableAllType>();
public OtherTest()
{
NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis();
}
[Fact] [Fact]
public void Div() public void Div()
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -944,8 +944,8 @@ limit 10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC"" b), 0) as6
FROM ""TB_TOPIC"" a", subquery); FROM ""TB_TOPIC"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -961,8 +961,8 @@ FROM ""TB_TOPIC"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC"" b), 0) as6
FROM ""TB_TOPIC"" a", subquery); FROM ""TB_TOPIC"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -978,8 +978,8 @@ FROM ""TB_TOPIC"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC"" b), 0) as6
FROM ""TB_TOPIC"" a", subquery); FROM ""TB_TOPIC"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -995,8 +995,8 @@ FROM ""TB_TOPIC"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""TB_TOPIC"" b), 0) as6
FROM ""TB_TOPIC"" a", subquery); FROM ""TB_TOPIC"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -981,8 +981,8 @@ ORDER BY newid()", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -998,8 +998,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1015,8 +1015,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1032,8 +1032,8 @@ FROM [tb_topic22] a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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]) 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) as6 FROM [tb_topic22] b), 0) as6
FROM [tb_topic22] a", subquery); FROM [tb_topic22] a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using FreeSql.Tests.DataContext.SqlServer; using FreeSql.Tests.DataContext.SqlServer;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@ -1003,8 +1003,8 @@ limit 0,10", t1);
all = a, all = a,
count = (long)select.As("b").Sum(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1020,8 +1020,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Min(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1037,8 +1037,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Max(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {
@ -1054,8 +1054,8 @@ FROM ""tb_topic22"" a", subquery);
all = a, all = a,
count = select.As("b").Avg(b => b.Id) 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"") 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) as6 FROM ""tb_topic22"" b), 0) as6
FROM ""tb_topic22"" a", subquery); FROM ""tb_topic22"" a", subquery);
var subqueryList = select.ToList(a => new var subqueryList = select.ToList(a => new
{ {

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -79,6 +79,7 @@ namespace FreeSql.Tests.SqliteExpression
var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList(); var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList();
var testlinq2list = new string[] { }; var testlinq2list = new string[] { };
var testlinq2 = g.sqlite.Delete<TableAllType>().Where(a => testlinq2list.Contains(a.String)).ToSql(); var testlinq2 = g.sqlite.Delete<TableAllType>().Where(a => testlinq2list.Contains(a.String)).ToSql();
Assert.Equal("DELETE FROM \"tb_alltype\" WHERE (((\"String\") in (NULL)))", testlinq2);
//in not in //in not in
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList(); var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();

View File

@ -1,22 +1,16 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using FreeSql; using Newtonsoft.Json;
using System; 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;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
using Zeus; using Zeus;
using Zeus.Domain.Enum; using Zeus.Domain.Enum;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using System.Threading;
using Newtonsoft.Json;
namespace FreeSql.Tests namespace FreeSql.Tests
{ {

View File

@ -1,19 +1,13 @@
using FreeSql.DataAnnotations; using FreeSql;
using FreeSql; using FreeSql.DataAnnotations;
using kwlib;
using Microsoft.Data.SqlClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit;
using System.Linq; using System.Linq;
using Newtonsoft.Json.Linq;
using NpgsqlTypes;
using Npgsql.LegacyPostgis;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Threading; using System.Threading;
using Microsoft.Data.SqlClient; using Xunit;
using kwlib;
using System.Text;
namespace FreeSql.Tests namespace FreeSql.Tests
{ {

View File

@ -1,25 +1,13 @@
using FreeSql.DataAnnotations; using FreeSql;
using FreeSql; using FreeSql.DataAnnotations;
using kwlib;
using System; using System;
using System.Collections.Generic; 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.Diagnostics;
using System.IO; using System.Linq;
using System.Text; using System.Text;
using Newtonsoft.Json; using System.Threading;
using System.Net.NetworkInformation; using Xunit;
using System.Net;
using System.Collections;
namespace FreeSql.Tests namespace FreeSql.Tests
{ {

View File

@ -206,36 +206,24 @@ namespace FreeSql.DataAnnotations
{ {
return _dicRegSqlWhereDateTimes.GetOrAdd($"{columnName},{quoteParameterName}", cn => 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[] return new[]
{ {
//new Regex($@"({cn}\s*(<|<=|>|>=|=|between)\s*)(datetime|cdate|to_date)\(('[^']+')\)", RegexOptions.IgnoreCase), new Regex($@"(\s*)(datetime|cdate|to_date)(\s*)\(\s*({qpn}[\w_]+)\s*\)", RegexOptions.IgnoreCase),
//new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))to_timestamp\(('[^']+')\s*,\s*'YYYY-MM-DD[^']+'\)", RegexOptions.IgnoreCase), new Regex($@"(\s*)(to_timestamp)(\s*)\(\s*({qpn}[\w_]+)\s*,\s*{qpn}[\w_]+\s*\)", RegexOptions.IgnoreCase),
//new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))cast\(('[^']+') as (datetime|timestamp)\)", RegexOptions.IgnoreCase), new Regex($@"(\s*)(cast)(\s*)\(\s*({qpn}[^w_]+)\s+as\s+(datetime|timestamp)\s*\)", RegexOptions.IgnoreCase),
//new Regex($@"({cn}\s*(<|<=|>|>=|=|between)(\s*))('[^']+')::(datetime|timestamp)", RegexOptions.IgnoreCase), new Regex($@"({qpn}[^w_]+)(\s*)(::)(\s*)(datetime|timestamp)", RegexOptions.IgnoreCase),
//new Regex($@"({cn}\s*(between)\s+'[^']+'\s+and\s+)(datetime|cdate|to_date)\(('[^']+')\)", RegexOptions.IgnoreCase), new Regex($@"(\s*)(timestamp)(\s*)({qpn}[\w_]+)", RegexOptions.IgnoreCase), //firebird
//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($@"{cn}\s*between\s*'([^']+)'\s*and\s*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用 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*'([^']+)'\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*'([^']+)'", RegexOptions.IgnoreCase), //预留暂时不用
new Regex($@"{cn}\s*(<|<=|>|>=)\s*{quoteParameterName}([\w_]+)", RegexOptions.IgnoreCase), new Regex($@"{cn}\s*(=|<|<=|>|>=)\s*{qpn}([\w_]+)", RegexOptions.IgnoreCase),
}; };
}); });
} }
@ -265,16 +253,16 @@ namespace FreeSql.DataAnnotations
//var tsqlWhere = Utils.ParseSqlWhereLevel1(sqlWhere); //var tsqlWhere = Utils.ParseSqlWhereLevel1(sqlWhere);
var regs = GetRegSqlWhereDateTimes($"{(string.IsNullOrWhiteSpace(tb.Alias) ? "" : $"{tb.Alias}.")}{commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name)}", quoteParameterName); 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); //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)); //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)); //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) if (m.Success)
{ {
var val1 = LocalGetParamValue(m.Groups[1].Value); 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)); if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere));
return GetTableNamesByColumnValueRange(val1, val2); return GetTableNamesByColumnValueRange(val1, val2);
} }
m = regs[11].Match(newSqlWhere); m = regs[8].Match(newSqlWhere);
if (m.Success) if (m.Success)
{ {
var val1 = LocalGetParamValue(m.Groups[2].Value); 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)); 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)); 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) if (m.Success)
{ {
var val1 = LocalGetParamValue(m.Groups[2].Value); var val1 = LocalGetParamValue(m.Groups[2].Value);
@ -349,6 +337,8 @@ namespace FreeSql.DataAnnotations
{ {
switch (m.Groups[1].Value) switch (m.Groups[1].Value)
{ {
case "=":
return GetTableNamesByColumnValueRange(val1, val1);
case "<": case "<":
val1 = val1.AddSeconds(-1); val1 = val1.AddSeconds(-1);
return GetTableNamesByColumnValueRange(_beginTime, val1); return GetTableNamesByColumnValueRange(_beginTime, val1);

View File

@ -2609,11 +2609,19 @@
</member> </member>
<member name="M:FreeSql.ISelectGrouping`2.Having(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},System.Boolean}})"> <member name="M:FreeSql.ISelectGrouping`2.Having(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},System.Boolean}})">
<summary> <summary>
按聚合条件过滤,Where(a => a.Count() > 10) 按聚合条件过滤,Having(a => a.Count() > 10)
</summary> </summary>
<param name="exp">lambda表达式</param> <param name="exp">lambda表达式</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.ISelectGrouping`2.HavingIf(System.Boolean,System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},System.Boolean}})">
<summary>
按聚合条件过滤HavingIf(true, a => a.Count() > 10)
</summary>
<param name="condition">true 时生效</param>
<param name="exp">lambda表达式</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelectGrouping`2.OrderBy``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})"> <member name="M:FreeSql.ISelectGrouping`2.OrderBy``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})">
<summary> <summary>
按列排序OrderBy(a => a.Time) 按列排序OrderBy(a => a.Time)

View File

@ -19,11 +19,18 @@ namespace FreeSql
#endif #endif
/// <summary> /// <summary>
/// 按聚合条件过滤,Where(a => a.Count() > 10) /// 按聚合条件过滤,Having(a => a.Count() > 10)
/// </summary> /// </summary>
/// <param name="exp">lambda表达式</param> /// <param name="exp">lambda表达式</param>
/// <returns></returns> /// <returns></returns>
ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp); ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp);
/// <summary>
/// 按聚合条件过滤HavingIf(true, a => a.Count() > 10)
/// </summary>
/// <param name="condition">true 时生效</param>
/// <param name="exp">lambda表达式</param>
/// <returns></returns>
ISelectGrouping<TKey, TValue> HavingIf(bool condition, Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp);
/// <summary> /// <summary>
/// 按列排序OrderBy(a => a.Time) /// 按列排序OrderBy(a => a.Time)

View File

@ -760,7 +760,9 @@ namespace FreeSql.Internal
var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null); var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null);
if (condExp.Test.IsParameter()) 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); tsc.SetMapTypeReturnOld(conditionalTestOldMapType);
var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc)); var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc));
tsc.SetMapTypeReturnOld(null); 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(); var sql4 = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({fieldSql})" })?.ToString();
asSelectBefores.Clear(); 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; 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); 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(); 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) if (string.IsNullOrEmpty(sqlSum) == false)
return $"({sqlSum.Replace(" \r\n", " \r\n ")})"; return _common.IsNull($"({sqlSum.Replace(" \r\n", " \r\n ")})", 0);
break; break;
case "ToList": case "ToList":
case "ToOne": case "ToOne":
@ -1965,7 +1967,33 @@ namespace FreeSql.Internal
return; return;
} }
exp3tmp = exp3Stack.Pop(); 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; if (exp3tmp.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate")) return;
var commonExp = sender as FreeSql.Internal.CommonExpression; var commonExp = sender as FreeSql.Internal.CommonExpression;
if (commonExp == null) return; 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); 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; 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; return;
} }
throw throwCallExp($"不支持 {callExp.Arguments.Count}个参数的方法"); throw throwCallExp($"不支持 {callExp.Arguments.Count}个参数的方法");

View File

@ -302,6 +302,11 @@ namespace FreeSql.Internal.CommonProvider
{ {
if (string.IsNullOrEmpty(sql)) return this as TSelect; if (string.IsNullOrEmpty(sql)) return this as TSelect;
_join.Append(" \r\n").Append(sql); _join.Append(" \r\n").Append(sql);
//fsql.Select<User1, UserGroup>().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; return this as TSelect;
} }

View File

@ -993,7 +993,8 @@ namespace FreeSql.Internal.CommonProvider
List<object> midList = new List<object>(); List<object> midList = new List<object>();
var tbref2 = _commonUtils.GetTableByEntity(tbref.RefEntityType); var tbref2 = _commonUtils.GetTableByEntity(tbref.RefEntityType);
var tbrefMid = _commonUtils.GetTableByEntity(tbref.RefMiddleEntityType); 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++) for (var z = 0; z < tbref.RefColumns.Count; z++)
{ {
if (z > 0) sbJoin.Append(" AND "); if (z > 0) sbJoin.Append(" AND ");

View File

@ -226,6 +226,7 @@ namespace FreeSql.Internal.CommonProvider
return this; return this;
} }
public ISelectGrouping<TKey, TValue> HavingIf(bool condition, Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp) => condition ? Having(exp) : this;
public ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp) public ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp)
{ {
_lambdaParameter = exp?.Parameters[0]; _lambdaParameter = exp?.Parameters[0];

View File

@ -24,5 +24,5 @@ namespace FreeSql.Internal.Model
public string Cascade { get; set; } public string Cascade { get; set; }
} }
public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, RawJoin, Parent }
} }

View File

@ -154,7 +154,7 @@ namespace FreeSql.ClickHouse
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -69,9 +69,11 @@ namespace FreeSql.ClickHouse.Curd
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -74,9 +74,11 @@ namespace FreeSql.Custom
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -22,40 +22,40 @@ namespace FreeSql.Dameng.Curd
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); 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 tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _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++) 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) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) 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 else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; 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(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").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 (!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 > 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) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; 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); 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)) sb.Append(" AND ").Append(tb.Cascade); 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 (!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); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,31 +99,39 @@ namespace FreeSql.Dameng.Curd
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) 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) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) 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 (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) 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 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); 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) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.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); 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(); 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) { } public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }

View File

@ -150,7 +150,7 @@ namespace FreeSql.Dameng
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -74,9 +74,11 @@ namespace FreeSql.Firebird.Curd
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -134,7 +134,7 @@ namespace FreeSql.Firebird
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -74,9 +74,11 @@ namespace FreeSql.GBase.Curd
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -28,7 +28,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Data.Odbc" Version="5.0.0" /> <PackageReference Include="System.Data.Odbc" Version="6.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -133,7 +133,7 @@ namespace FreeSql.GBase
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -69,9 +69,11 @@ namespace FreeSql.KingbaseES
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -155,7 +155,7 @@ namespace FreeSql.KingbaseES
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -78,9 +78,11 @@ namespace FreeSql.MsAccess.Curd
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
if (ioinCounter++ > 0) sb.Insert(fromIndex, "(").Append(") "); if (ioinCounter++ > 0) sb.Insert(fromIndex, "(").Append(") ");
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");

View File

@ -138,7 +138,7 @@ namespace FreeSql.MsAccess
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -69,9 +69,11 @@ namespace FreeSql.MySql.Curd
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -25,7 +25,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net452'"> <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net452'">
<PackageReference Include="MySql.Data" Version="8.0.27" /> <PackageReference Include="MySql.Data" Version="8.0.29" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net45' or '$(TargetFramework)' == 'net40'"> <ItemGroup Condition="'$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net45' or '$(TargetFramework)' == 'net40'">
<PackageReference Include="MySql.Data" Version="6.9.12" /> <PackageReference Include="MySql.Data" Version="6.9.12" />

View File

@ -138,7 +138,7 @@ namespace FreeSql.MySql
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Dameng
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); 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 tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _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++) 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) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) 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 else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; 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(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").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 (!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 > 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) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; 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); 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)) sb.Append(" AND ").Append(tb.Cascade); 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 (!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); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,31 +99,39 @@ namespace FreeSql.Odbc.Dameng
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) 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) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) 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 (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) 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 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); 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) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.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); 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(); 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) { } public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }

View File

@ -155,7 +155,7 @@ namespace FreeSql.Odbc.Dameng
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -74,9 +74,11 @@ namespace FreeSql.Odbc.Default
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -139,7 +139,7 @@ namespace FreeSql.Odbc.Default
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -69,9 +69,11 @@ namespace FreeSql.Odbc.KingbaseES
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -155,7 +155,7 @@ namespace FreeSql.Odbc.KingbaseES
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -69,9 +69,11 @@ namespace FreeSql.Odbc.MySql
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sb.Append(" \r\nLEFT JOIN ");
break; break;

View File

@ -133,7 +133,7 @@ namespace FreeSql.Odbc.MySql
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

View File

@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Oracle
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); 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 tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _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++) 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) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) 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 else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; 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(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").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 (!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 > 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) foreach (var tb in tbsjoin)
{ {
if (tb.Type == SelectTableInfoType.Parent) continue;
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.Parent:
case SelectTableInfoType.RawJoin:
continue;
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; 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); 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)) sb.Append(" AND ").Append(tb.Cascade); 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 (!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); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,29 +99,31 @@ namespace FreeSql.Odbc.Oracle
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) 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) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) 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 (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) 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 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); 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) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.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); 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(); sbnav.Clear();
if (tbUnionsGt0) sb.Append(") ftb"); sbunion.Clear();
} }
var sql = sb.Append(_tosqlAppendContent).ToString(); var sql = sb.Append(_tosqlAppendContent).ToString();

View File

@ -155,7 +155,7 @@ namespace FreeSql.Odbc.Oracle
catch (Exception ex) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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) catch (Exception ex)
{ {
if (_pool.SetUnavailable(ex) == true) 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}");
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More