mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
Merge main branches
This commit is contained in:
commit
747603dbb6
@ -9,7 +9,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>3.2.606</Version>
|
<Version>3.2.650-preview20220518</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -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) =>
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -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" />
|
||||||
|
@ -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();
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"profiles": {
|
|
||||||
"WSL": {
|
|
||||||
"commandName": "WSL2",
|
|
||||||
"distributionName": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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>
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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]);
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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">
|
||||||
|
@ -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) },
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
258
FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs
Normal file
258
FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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());
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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) },
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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}个参数的方法");
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ");
|
||||||
|
@ -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];
|
||||||
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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) { }
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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;
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 ");
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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" />
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) { }
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user