mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-01 00:05:28 +08:00 
			
		
		
		
	- 增加 ISelect.WhereCascade 实现多表查询时,向每个表中附加条件;
- 增加 Examples 项目 base_entity,利用 BaseEntity 实现简洁的数据库操作;
This commit is contained in:
		
							
								
								
									
										163
									
								
								Examples/base_entity/BaseEntity.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								Examples/base_entity/BaseEntity.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | |||||||
|  | using FreeSql; | ||||||
|  | using FreeSql.DataAnnotations; | ||||||
|  | using Newtonsoft.Json; | ||||||
|  | using System; | ||||||
|  | using System.Diagnostics; | ||||||
|  | using System.Linq.Expressions; | ||||||
|  |  | ||||||
|  | [Table(DisableSyncStructure = true)] | ||||||
|  | public abstract class BaseEntity | ||||||
|  | { | ||||||
|  |     private static Lazy<IFreeSql> _ormLazy = new Lazy<IFreeSql>(() => | ||||||
|  |     { | ||||||
|  |         var orm = new FreeSqlBuilder() | ||||||
|  |             .UseAutoSyncStructure(true) | ||||||
|  |             .UseNoneCommandParameter(true) | ||||||
|  |             .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") | ||||||
|  |             .Build(); | ||||||
|  |         orm.Aop.CurdBefore += (s, e) => Trace.WriteLine(e.Sql + "\r\n"); | ||||||
|  |         return orm; | ||||||
|  |     }); | ||||||
|  |     public static IFreeSql Orm => _ormLazy.Value; | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 创建时间 | ||||||
|  |     /// </summary> | ||||||
|  |     public DateTime CreateTime { get; set; } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 更新时间 | ||||||
|  |     /// </summary> | ||||||
|  |     public DateTime UpdateTime { get; set; } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 逻辑删除 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool IsDeleted { get; set; } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [Table(DisableSyncStructure = true)] | ||||||
|  | public abstract class BaseEntity<TEntity> : BaseEntity where TEntity : class | ||||||
|  | { | ||||||
|  |     public static ISelect<TEntity> Select => Orm.Select<TEntity>().WhereCascade(a => (a as BaseEntity<TEntity>).IsDeleted == false); | ||||||
|  |     public static ISelect<TEntity> Where(Expression<Func<TEntity, bool>> exp) => Select.Where(exp); | ||||||
|  |     public static ISelect<TEntity> WhereIf(bool condition, Expression<Func<TEntity, bool>> exp) => Select.WhereIf(condition, exp); | ||||||
|  |  | ||||||
|  |     [JsonIgnore] | ||||||
|  |     protected IBaseRepository<TEntity> Repository { get; set; } | ||||||
|  |  | ||||||
|  |     bool UpdateIsDeleted(bool value) | ||||||
|  |     { | ||||||
|  |         if (this.Repository == null) | ||||||
|  |             return Orm.Update<TEntity>(this as TEntity).Set(a => (a as BaseEntity<TEntity>).IsDeleted, this.IsDeleted = value).ExecuteAffrows() == 1; | ||||||
|  |         this.IsDeleted = value; | ||||||
|  |         return this.Repository.Update(this as TEntity) == 1; | ||||||
|  |     } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 删除数据 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public virtual bool Delete() => this.UpdateIsDeleted(true); | ||||||
|  |     /// <summary> | ||||||
|  |     /// 恢复删除的数据 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public virtual bool Restore() => this.UpdateIsDeleted(false); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 附加实体,在更新数据时,只更新变化的部分 | ||||||
|  |     /// </summary> | ||||||
|  |     public void Attach() | ||||||
|  |     { | ||||||
|  |         if (this.Repository == null) this.Repository = Orm.GetRepository<TEntity>(); | ||||||
|  |         this.Repository.Attach(this as TEntity); | ||||||
|  |     } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 更新数据 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public virtual bool Update() | ||||||
|  |     { | ||||||
|  |         if (this.Repository == null) | ||||||
|  |             return Orm.Update<TEntity>().SetSource(this as TEntity).ExecuteAffrows() == 1; | ||||||
|  |         return this.Repository.Update(this as TEntity) == 1; | ||||||
|  |     } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 插入数据 | ||||||
|  |     /// </summary> | ||||||
|  |     public virtual void Insert() | ||||||
|  |     { | ||||||
|  |         if (this.Repository == null) this.Repository = Orm.GetRepository<TEntity>(); | ||||||
|  |         this.Repository.Insert(this as TEntity); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 更新或插入 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public virtual void Save() | ||||||
|  |     { | ||||||
|  |         if (this.Repository == null) this.Repository = Orm.GetRepository<TEntity>(); | ||||||
|  |         this.Repository.InsertOrUpdate(this as TEntity); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [Table(DisableSyncStructure = true)] | ||||||
|  | public abstract class BaseEntity<TEntity, TKey> : BaseEntity<TEntity> where TEntity : class | ||||||
|  | { | ||||||
|  |     static BaseEntity() | ||||||
|  |     { | ||||||
|  |         var tkeyType = typeof(TKey)?.NullableTypeOrThis(); | ||||||
|  |         if (tkeyType == typeof(int) || tkeyType == typeof(long)) | ||||||
|  |             Orm.CodeFirst.ConfigEntity(typeof(TEntity), | ||||||
|  |                 t => t.Property("Id").IsIdentity(true)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 主键 | ||||||
|  |     /// </summary> | ||||||
|  |     public virtual TKey Id { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 根据主键值获取数据 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="id"></param> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public static TEntity Find(TKey id) | ||||||
|  |     { | ||||||
|  |         var item = Select.WhereDynamic(id).First(); | ||||||
|  |         (item as BaseEntity<TEntity>)?.Attach(); | ||||||
|  |         return item; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [Table(DisableSyncStructure = true)] | ||||||
|  | public abstract class BaseEntity<TEntity, TKey1, TKey2> : BaseEntity<TEntity> where TEntity : class | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 主键1 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(IsPrimary = true)] | ||||||
|  |     public virtual TKey1 PkId1 { get; set; } | ||||||
|  |     /// <summary> | ||||||
|  |     /// 主键2 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(IsPrimary = true)] | ||||||
|  |     public virtual TKey2 PkId2 { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 根据主键值获取数据 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="pkid1">主键1</param> | ||||||
|  |     /// <param name="pkid2">主键2</param> | ||||||
|  |     /// <returns></returns> | ||||||
|  |     public static TEntity Find(TKey1 pkid1, TKey1 pkid2) | ||||||
|  |     { | ||||||
|  |         var item = Select.WhereDynamic(new | ||||||
|  |         { | ||||||
|  |             PkId1 = pkid1, | ||||||
|  |             PkId2 = pkid2 | ||||||
|  |         }).First(); | ||||||
|  |         (item as BaseEntity<TEntity>).Attach(); | ||||||
|  |         return item; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										91
									
								
								Examples/base_entity/Entities/User.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								Examples/base_entity/Entities/User.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Text; | ||||||
|  |  | ||||||
|  | public class UserGroup : BaseEntity<UserGroup, int> | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// 组名 | ||||||
|  |     /// </summary> | ||||||
|  |     public string GroupName { get; set; } | ||||||
|  |  | ||||||
|  |     public List<User1> User1s { get; set; } | ||||||
|  |  | ||||||
|  |     public List<User2> User2s { get; set; } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public class Role : BaseEntity<Role, string> | ||||||
|  | { | ||||||
|  |     public List<User1> User1s { get; set; } | ||||||
|  | } | ||||||
|  | public class RoleUser1 : BaseEntity<RoleUser1> | ||||||
|  | { | ||||||
|  |     public string RoleId { get; set; } | ||||||
|  |     public Guid User1Id { get; set; } | ||||||
|  |  | ||||||
|  |     public Role Role { get; set; } | ||||||
|  |     public User1 User1 { get; set; } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public class User1 : BaseEntity<User1, Guid> | ||||||
|  | { | ||||||
|  |     public int GroupId { get; set; } | ||||||
|  |     public UserGroup Group { get; set; } | ||||||
|  |  | ||||||
|  |     public List<Role> Roles { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 登陆名 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Username { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 昵称 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Nickname { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 头像 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Avatar { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 描述 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Description { get; set; } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public class User2 : BaseEntity<User2, Guid, int> | ||||||
|  | { | ||||||
|  |     static User2() | ||||||
|  |     { | ||||||
|  |         User2.Orm.CodeFirst.ConfigEntity<User2>(t => | ||||||
|  |         { | ||||||
|  |             t.Property(a => a.PkId1).Name("UserId"); | ||||||
|  |             t.Property(a => a.PkId2).Name("Index"); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public int GroupId { get; set; } | ||||||
|  |     public UserGroup Group { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 登陆名 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Username { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 昵称 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Nickname { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 头像 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Avatar { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// 描述 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Description { get; set; } | ||||||
|  | } | ||||||
							
								
								
									
										82
									
								
								Examples/base_entity/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								Examples/base_entity/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | using System; | ||||||
|  |  | ||||||
|  | namespace base_entity | ||||||
|  | { | ||||||
|  |     class Program | ||||||
|  |     { | ||||||
|  |         static void Main(string[] args) | ||||||
|  |         { | ||||||
|  |             var ug1 = new UserGroup(); | ||||||
|  |             ug1.GroupName = "分组一"; | ||||||
|  |             ug1.Insert(); | ||||||
|  |  | ||||||
|  |             var ug2 = new UserGroup(); | ||||||
|  |             ug2.GroupName = "分组二"; | ||||||
|  |             ug2.Insert(); | ||||||
|  |  | ||||||
|  |             var u1 = new User1(); | ||||||
|  |             var u2 = new User2(); | ||||||
|  |  | ||||||
|  |             u1.GroupId = ug1.Id; | ||||||
|  |             u1.Save(); | ||||||
|  |  | ||||||
|  |             u2.GroupId = ug2.Id; | ||||||
|  |             u2.Save(); | ||||||
|  |  | ||||||
|  |             u1.Delete(); | ||||||
|  |             u1.Restore(); | ||||||
|  |  | ||||||
|  |             u1.Nickname = "x1"; | ||||||
|  |             u1.Update(); | ||||||
|  |  | ||||||
|  |             u2.Delete(); | ||||||
|  |             u2.Restore(); | ||||||
|  |  | ||||||
|  |             u2.Username = "x2"; | ||||||
|  |             u2.Update(); | ||||||
|  |  | ||||||
|  |             var u11 = User1.Find(u1.Id); | ||||||
|  |             u11.Description = "备注"; | ||||||
|  |             u11.Save(); | ||||||
|  |  | ||||||
|  |             u11.Delete(); | ||||||
|  |  | ||||||
|  |             var u11null = User1.Find(u1.Id); | ||||||
|  |  | ||||||
|  |             var u11s = User1.Where(a => a.Group.Id == ug1.Id).Limit(10).ToList(); | ||||||
|  |             var u22s = User2.Where(a => a.Group.Id == ug2.Id).Limit(10).ToList(); | ||||||
|  |  | ||||||
|  |             var u11s2 = User1.Select.LeftJoin<UserGroup>((a, b) => a.GroupId == b.Id).Limit(10).ToList(); | ||||||
|  |             var u22s2 = User2.Select.LeftJoin<UserGroup>((a, b) => a.GroupId == b.Id).Limit(10).ToList(); | ||||||
|  |  | ||||||
|  |             var ug1s = UserGroup.Select | ||||||
|  |                 .IncludeMany(a => a.User1s) | ||||||
|  |                 .IncludeMany(a => a.User2s) | ||||||
|  |                 .Limit(10).ToList(); | ||||||
|  |  | ||||||
|  |             var ug1s2 = UserGroup.Select.Where(a => a.User1s.AsSelect().Any(b => b.Nickname == "x1")).Limit(10).ToList(); | ||||||
|  |  | ||||||
|  |             var r1 = new Role(); | ||||||
|  |             r1.Id = "管理员"; | ||||||
|  |             r1.Save(); | ||||||
|  |  | ||||||
|  |             var r2 = new Role(); | ||||||
|  |             r2.Id = "超级会员"; | ||||||
|  |             r2.Save(); | ||||||
|  |  | ||||||
|  |             var ru1 = new RoleUser1(); | ||||||
|  |             ru1.User1Id = u1.Id; | ||||||
|  |             ru1.RoleId = r1.Id; | ||||||
|  |             ru1.Save(); | ||||||
|  |  | ||||||
|  |             ru1.RoleId = r2.Id; | ||||||
|  |             ru1.Save(); | ||||||
|  |  | ||||||
|  |             var u1roles = User1.Select.IncludeMany(a => a.Roles).ToList(); | ||||||
|  |             var u1roles2 = User1.Select.Where(a => a.Roles.AsSelect().Any(b => b.Id == "xx")).ToList(); | ||||||
|  |  | ||||||
|  |             Console.WriteLine("按任意键结束。。。"); | ||||||
|  |             Console.ReadKey(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								Examples/base_entity/base_entity.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Examples/base_entity/base_entity.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>netcoreapp2.2</TargetFramework> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" /> | ||||||
|  |     <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" /> | ||||||
|  |     <ProjectReference Include="..\..\Providers\FreeSql.Provider.Sqlite\FreeSql.Provider.Sqlite.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description> | 		<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description> | 		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table.</Description> | 		<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table.</Description> | ||||||
| 		<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl> | 		<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl> | ||||||
|   | |||||||
| @@ -568,6 +568,7 @@ namespace FreeSql.Tests.Sqlite | |||||||
|             Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a", sql); |             Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a", sql); | ||||||
|             query.First(); |             query.First(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         [Fact] |         [Fact] | ||||||
|         public void WhereExists() |         public void WhereExists() | ||||||
|         { |         { | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								FreeSql.sln
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								FreeSql.sln
									
									
									
									
									
								
							| @@ -54,6 +54,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.PerformanceTe | |||||||
| EndProject | EndProject | ||||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.MySqlConnector", "FreeSql.Tests\FreeSql.Tests.Provider.MySqlConnector\FreeSql.Tests.Provider.MySqlConnector.csproj", "{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.MySqlConnector", "FreeSql.Tests\FreeSql.Tests.Provider.MySqlConnector\FreeSql.Tests.Provider.MySqlConnector.csproj", "{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}" | ||||||
| EndProject | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "base_entity", "Examples\base_entity\base_entity.csproj", "{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}" | ||||||
|  | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|Any CPU = Debug|Any CPU | 		Debug|Any CPU = Debug|Any CPU | ||||||
| @@ -304,6 +306,18 @@ Global | |||||||
| 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x64.Build.0 = Release|Any CPU | 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x64.Build.0 = Release|Any CPU | ||||||
| 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x86.ActiveCfg = Release|Any CPU | 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
| 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x86.Build.0 = Release|Any CPU | 		{0F45294A-34FF-4FB8-A046-20E09E3A4D5C}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0}.Release|x86.Build.0 = Release|Any CPU | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(SolutionProperties) = preSolution | 	GlobalSection(SolutionProperties) = preSolution | ||||||
| 		HideSolutionNode = FALSE | 		HideSolutionNode = FALSE | ||||||
| @@ -322,6 +336,7 @@ Global | |||||||
| 		{D2A41321-5E84-410B-B25C-3AA122D4CA27} = {2A381C57-2697-427B-9F10-55DA11FD02E4} | 		{D2A41321-5E84-410B-B25C-3AA122D4CA27} = {2A381C57-2697-427B-9F10-55DA11FD02E4} | ||||||
| 		{690F89E0-A721-423F-8F5D-D262F73235EA} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} | 		{690F89E0-A721-423F-8F5D-D262F73235EA} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} | ||||||
| 		{4C0973CB-BD49-4A5B-A6FE-EE0594BDD513} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} | 		{4C0973CB-BD49-4A5B-A6FE-EE0594BDD513} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} | ||||||
|  | 		{D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||||
| 		SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} | 		SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description> | 		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description> | ||||||
|   | |||||||
| @@ -1259,6 +1259,21 @@ | |||||||
|             <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> |             <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> | ||||||
|             <returns></returns> |             <returns></returns> | ||||||
|         </member> |         </member> | ||||||
|  |         <member name="M:FreeSql.ISelect`1.WhereCascade(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})"> | ||||||
|  |             <summary> | ||||||
|  |             多表查询时,该方法标记后,表达式条件将对所有表进行附加 | ||||||
|  |             <para></para> | ||||||
|  |             例如:软删除、租户,每个表都给条件,挺麻烦的 | ||||||
|  |             <para></para> | ||||||
|  |             fsql.Select<T1>().LeftJoin<T2>(...).Where<T2>((t1, t2 => t1.IsDeleted == false && t2.IsDeleted == false) | ||||||
|  |             <para></para> | ||||||
|  |             修改:fsql.Select<T1>().LeftJoin<T2>(...).WhereCascade(t1 => t1.IsDeleted == false) | ||||||
|  |             <para></para> | ||||||
|  |             当其中的实体可附加表达式才会进行,表越多时收益越大 | ||||||
|  |             </summary> | ||||||
|  |             <param name="exp"></param> | ||||||
|  |             <returns></returns> | ||||||
|  |         </member> | ||||||
|         <member name="M:FreeSql.ISelect`1.GroupBy``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})"> |         <member name="M:FreeSql.ISelect`1.GroupBy``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})"> | ||||||
|             <summary> |             <summary> | ||||||
|             按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) |             按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ using System; | |||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
| using System.Data.Common; | using System.Data.Common; | ||||||
| using System.Diagnostics; | using System.Diagnostics; | ||||||
|  | using System.Security.Cryptography; | ||||||
|  | using System.Text; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| @@ -33,4 +35,16 @@ public static class FreeUtil | |||||||
|         var guid = $"{uninxtime.ToString("x8").PadLeft(8, '0')}{__staticMachine.ToString("x8").PadLeft(8, '0').Substring(2, 6)}{__staticPid.ToString("x8").PadLeft(8, '0').Substring(6, 2)}{increment.ToString("x8").PadLeft(8, '0')}{rand.ToString("x8").PadLeft(8, '0')}"; |         var guid = $"{uninxtime.ToString("x8").PadLeft(8, '0')}{__staticMachine.ToString("x8").PadLeft(8, '0').Substring(2, 6)}{__staticPid.ToString("x8").PadLeft(8, '0').Substring(6, 2)}{increment.ToString("x8").PadLeft(8, '0')}{rand.ToString("x8").PadLeft(8, '0')}"; | ||||||
|         return Guid.Parse(guid); |         return Guid.Parse(guid); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static string Sha1(string str) | ||||||
|  |     { | ||||||
|  |         var buffer = Encoding.UTF8.GetBytes(str); | ||||||
|  |         var data = SHA1.Create().ComputeHash(buffer); | ||||||
|  |  | ||||||
|  |         var sub = new StringBuilder(); | ||||||
|  |         foreach (var t in data) | ||||||
|  |             sub.Append(t.ToString("X2")); | ||||||
|  |  | ||||||
|  |         return sub.ToString(); | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -275,6 +275,21 @@ namespace FreeSql | |||||||
|         /// <returns></returns> |         /// <returns></returns> | ||||||
|         ISelect<T1> WhereDynamic(object dywhere); |         ISelect<T1> WhereDynamic(object dywhere); | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// 多表查询时,该方法标记后,表达式条件将对所有表进行附加 | ||||||
|  |         /// <para></para> | ||||||
|  |         /// 例如:软删除、租户,每个表都给条件,挺麻烦的 | ||||||
|  |         /// <para></para> | ||||||
|  |         /// fsql.Select<T1>().LeftJoin<T2>(...).Where<T2>((t1, t2 => t1.IsDeleted == false && t2.IsDeleted == false) | ||||||
|  |         /// <para></para> | ||||||
|  |         /// 修改:fsql.Select<T1>().LeftJoin<T2>(...).WhereCascade(t1 => t1.IsDeleted == false) | ||||||
|  |         /// <para></para> | ||||||
|  |         /// 当其中的实体可附加表达式才会进行,表越多时收益越大 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="exp"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         ISelect<T1> WhereCascade(Expression<Func<T1, bool>> exp); | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) |         /// 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | ||||||
|         /// </summary> |         /// </summary> | ||||||
|   | |||||||
| @@ -24,20 +24,20 @@ namespace FreeSql.Internal | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         static ConcurrentDictionary<Type, PropertyInfo[]> _dicReadAnonymousFieldDtoPropertys = new ConcurrentDictionary<Type, PropertyInfo[]>(); |         static ConcurrentDictionary<Type, PropertyInfo[]> _dicReadAnonymousFieldDtoPropertys = new ConcurrentDictionary<Type, PropertyInfo[]>(); | ||||||
|         public bool ReadAnonymousField(List<SelectTableInfo> _tables, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Func<Expression[], string> getSelectGroupingMapString) |         public bool ReadAnonymousField(List<SelectTableInfo> _tables, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression) | ||||||
|         { |         { | ||||||
|             Func<ExpTSC> getTSC = () => new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }; |             Func<ExpTSC> getTSC = () => new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }; | ||||||
|             switch (exp.NodeType) |             switch (exp.NodeType) | ||||||
|             { |             { | ||||||
|                 case ExpressionType.Quote: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString); |                 case ExpressionType.Quote: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                 case ExpressionType.Lambda: return ReadAnonymousField(_tables, field, parent, ref index, (exp as LambdaExpression)?.Body, getSelectGroupingMapString); |                 case ExpressionType.Lambda: return ReadAnonymousField(_tables, field, parent, ref index, (exp as LambdaExpression)?.Body, getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                 case ExpressionType.Negate: |                 case ExpressionType.Negate: | ||||||
|                 case ExpressionType.NegateChecked: |                 case ExpressionType.NegateChecked: | ||||||
|                     parent.DbField = $"-({ExpressionLambdaToSql(exp, getTSC())})"; |                     parent.DbField = $"-({ExpressionLambdaToSql(exp, getTSC())})"; | ||||||
|                     field.Append(", ").Append(parent.DbField); |                     field.Append(", ").Append(parent.DbField); | ||||||
|                     if (index >= 0) field.Append(" as").Append(++index); |                     if (index >= 0) field.Append(" as").Append(++index); | ||||||
|                     return false; |                     return false; | ||||||
|                 case ExpressionType.Convert: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString); |                 case ExpressionType.Convert: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                 case ExpressionType.Constant: |                 case ExpressionType.Constant: | ||||||
|                     var constExp = exp as ConstantExpression; |                     var constExp = exp as ConstantExpression; | ||||||
|                     //处理自定义SQL语句,如: ToList(new {  |                     //处理自定义SQL语句,如: ToList(new {  | ||||||
| @@ -117,7 +117,7 @@ namespace FreeSql.Internal | |||||||
|                                 MapType = initAssignExp.Expression.Type |                                 MapType = initAssignExp.Expression.Type | ||||||
|                             }; |                             }; | ||||||
|                             parent.Childs.Add(child); |                             parent.Childs.Add(child); | ||||||
|                             ReadAnonymousField(_tables, field, child, ref index, initAssignExp.Expression, getSelectGroupingMapString); |                             ReadAnonymousField(_tables, field, child, ref index, initAssignExp.Expression, getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
| @@ -139,7 +139,7 @@ namespace FreeSql.Internal | |||||||
|                                     }; |                                     }; | ||||||
|                                     parent.Childs.Add(child); |                                     parent.Childs.Add(child); | ||||||
|                                     if (dtTb.Parameter != null) |                                     if (dtTb.Parameter != null) | ||||||
|                                         ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString); |                                         ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                                     else |                                     else | ||||||
|                                     { |                                     { | ||||||
|                                         child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}"; |                                         child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}"; | ||||||
| @@ -169,7 +169,7 @@ namespace FreeSql.Internal | |||||||
|                                 MapType = newExp.Arguments[a].Type |                                 MapType = newExp.Arguments[a].Type | ||||||
|                             }; |                             }; | ||||||
|                             parent.Childs.Add(child); |                             parent.Childs.Add(child); | ||||||
|                             ReadAnonymousField(_tables, field, child, ref index, newExp.Arguments[a], getSelectGroupingMapString); |                             ReadAnonymousField(_tables, field, child, ref index, newExp.Arguments[a], getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
| @@ -192,7 +192,7 @@ namespace FreeSql.Internal | |||||||
|                                     }; |                                     }; | ||||||
|                                     parent.Childs.Add(child); |                                     parent.Childs.Add(child); | ||||||
|                                     if (dtTb.Parameter != null) |                                     if (dtTb.Parameter != null) | ||||||
|                                         ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString); |                                         ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression); | ||||||
|                                     else |                                     else | ||||||
|                                     { |                                     { | ||||||
|                                         child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}"; |                                         child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}"; | ||||||
| @@ -332,9 +332,9 @@ namespace FreeSql.Internal | |||||||
|             return sql; |             return sql; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString) |         public string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression) | ||||||
|         { |         { | ||||||
|             var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); |             var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); | ||||||
|             var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); |             var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); | ||||||
|             if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) |             if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) | ||||||
|                 return $"{sql} = {formatSql(true, null)}"; |                 return $"{sql} = {formatSql(true, null)}"; | ||||||
| @@ -343,10 +343,10 @@ namespace FreeSql.Internal | |||||||
|             return sql; |             return sql; | ||||||
|         } |         } | ||||||
|         static ConcurrentDictionary<string, Regex> dicRegexAlias = new ConcurrentDictionary<string, Regex>(); |         static ConcurrentDictionary<string, Regex> dicRegexAlias = new ConcurrentDictionary<string, Regex>(); | ||||||
|         public void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString) |         public void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression) | ||||||
|         { |         { | ||||||
|             var tbidx = _tables.Count; |             var tbidx = _tables.Count; | ||||||
|             var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); |             var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); | ||||||
|             var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); |             var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); | ||||||
|             if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) |             if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) | ||||||
|                 sql = $"{sql} = {formatSql(true, null)}"; |                 sql = $"{sql} = {formatSql(true, null)}"; | ||||||
| @@ -362,8 +362,8 @@ namespace FreeSql.Internal | |||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 var find = _tables.Where((a, c) => c > 0 &&  |                 var find = _tables.Where((a, c) => c > 0 && | ||||||
|                     (a.Type == tbtype || a.Type == SelectTableInfoType.From) &&  |                     (a.Type == tbtype || a.Type == SelectTableInfoType.From) && | ||||||
|                     string.IsNullOrEmpty(a.On) && |                     string.IsNullOrEmpty(a.On) && | ||||||
|                     dicRegexAlias.GetOrAdd(a.Alias, alias => new Regex($@"\b{alias}\.", RegexOptions.Compiled)).IsMatch(sql)).LastOrDefault(); |                     dicRegexAlias.GetOrAdd(a.Alias, alias => new Regex($@"\b{alias}\.", RegexOptions.Compiled)).IsMatch(sql)).LastOrDefault(); | ||||||
|                 if (find != null) |                 if (find != null) | ||||||
| @@ -473,7 +473,7 @@ namespace FreeSql.Internal | |||||||
|                 left = tmp; |                 left = tmp; | ||||||
|             } |             } | ||||||
|             if (right == "NULL") oper = oper == "=" ? " IS " : " IS NOT "; |             if (right == "NULL") oper = oper == "=" ? " IS " : " IS NOT "; | ||||||
|             switch(oper) |             switch (oper) | ||||||
|             { |             { | ||||||
|                 case "%": return _common.Mod(left, right, leftExp.Type, rightExp.Type); |                 case "%": return _common.Mod(left, right, leftExp.Type, rightExp.Type); | ||||||
|                 case "AND": |                 case "AND": | ||||||
| @@ -647,6 +647,12 @@ namespace FreeSql.Internal | |||||||
|                                                 Type = SelectTableInfoType.Parent, |                                                 Type = SelectTableInfoType.Parent, | ||||||
|                                                 Parameter = a.Parameter |                                                 Parameter = a.Parameter | ||||||
|                                             })); |                                             })); | ||||||
|  |                                         if (tsc.whereCascadeExpression?.Any() == true) | ||||||
|  |                                         { | ||||||
|  |                                             var fsqlCascade = fsqlType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(fsql) as List<LambdaExpression>; | ||||||
|  |                                             if (fsqlCascade != tsc.whereCascadeExpression) | ||||||
|  |                                                 fsqlCascade.AddRange(tsc.whereCascadeExpression); | ||||||
|  |                                         } | ||||||
|                                     } |                                     } | ||||||
|                                     else if (fsqlType != null) |                                     else if (fsqlType != null) | ||||||
|                                     { |                                     { | ||||||
| @@ -907,7 +913,8 @@ namespace FreeSql.Internal | |||||||
|                         } |                         } | ||||||
|                         var name = tb.ColumnsByCs[memberExp.Member.Name].Attribute.Name; |                         var name = tb.ColumnsByCs[memberExp.Member.Name].Attribute.Name; | ||||||
|                         if (tsc.isQuoteName) name = _common.QuoteSqlName(name); |                         if (tsc.isQuoteName) name = _common.QuoteSqlName(name); | ||||||
|                         return name; |                         if (string.IsNullOrEmpty(tsc.alias001)) return name; | ||||||
|  |                         return $"{tsc.alias001}.{name}"; | ||||||
|                     } |                     } | ||||||
|                     Func<TableInfo, string, bool, ParameterExpression, MemberExpression, SelectTableInfo> getOrAddTable = (tbtmp, alias, isa, parmExp, mp) => |                     Func<TableInfo, string, bool, ParameterExpression, MemberExpression, SelectTableInfo> getOrAddTable = (tbtmp, alias, isa, parmExp, mp) => | ||||||
|                     { |                     { | ||||||
| @@ -1113,6 +1120,8 @@ namespace FreeSql.Internal | |||||||
|             public ExpressionStyle style { get; set; } |             public ExpressionStyle style { get; set; } | ||||||
|             public Type mapType { get; set; } |             public Type mapType { get; set; } | ||||||
|             public TableInfo currentTable { get; set; } |             public TableInfo currentTable { get; set; } | ||||||
|  |             public List<LambdaExpression> whereCascadeExpression { get; set; } | ||||||
|  |             public string alias001 { get; set; } //单表字段的表别名 | ||||||
|  |  | ||||||
|             public ExpTSC CloneSetgetSelectGroupingMapStringAndgetSelectGroupingMapStringAndtbtype(List<SelectColumnInfo> v1, Func<Expression[], string> v2, SelectTableInfoType v3) |             public ExpTSC CloneSetgetSelectGroupingMapStringAndgetSelectGroupingMapStringAndtbtype(List<SelectColumnInfo> v1, Func<Expression[], string> v2, SelectTableInfoType v3) | ||||||
|             { |             { | ||||||
| @@ -1125,7 +1134,9 @@ namespace FreeSql.Internal | |||||||
|                     isQuoteName = this.isQuoteName, |                     isQuoteName = this.isQuoteName, | ||||||
|                     isDisableDiyParse = this.isDisableDiyParse, |                     isDisableDiyParse = this.isDisableDiyParse, | ||||||
|                     style = this.style, |                     style = this.style, | ||||||
|                     currentTable = this.currentTable |                     currentTable = this.currentTable, | ||||||
|  |                     whereCascadeExpression = this.whereCascadeExpression, | ||||||
|  |                     alias001 = this.alias001 | ||||||
|                 }; |                 }; | ||||||
|             } |             } | ||||||
|             public ExpTSC CloneDisableDiyParse() |             public ExpTSC CloneDisableDiyParse() | ||||||
| @@ -1139,11 +1150,46 @@ namespace FreeSql.Internal | |||||||
|                     isQuoteName = this.isQuoteName, |                     isQuoteName = this.isQuoteName, | ||||||
|                     isDisableDiyParse = true, |                     isDisableDiyParse = true, | ||||||
|                     style = this.style, |                     style = this.style, | ||||||
|                     currentTable = this.currentTable |                     currentTable = this.currentTable, | ||||||
|  |                     whereCascadeExpression = this.whereCascadeExpression, | ||||||
|  |                     alias001 = this.alias001 | ||||||
|                 }; |                 }; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         static ConcurrentDictionary<string, bool> _dicGetWhereCascadeSqlError = new ConcurrentDictionary<string, bool>(); | ||||||
|  |         public string GetWhereCascadeSql(SelectTableInfo tb, List<LambdaExpression> _whereCascadeExpression) | ||||||
|  |         { | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |             { | ||||||
|  |                 var newParameter = Expression.Parameter(tb.Table.Type, "c"); | ||||||
|  |                 Expression newExp = null; | ||||||
|  |  | ||||||
|  |                 foreach (var fl in _whereCascadeExpression) | ||||||
|  |                 { | ||||||
|  |                     var errorKey = FreeUtil.Sha1($"{tb.Table.Type.FullName},{fl.ToString()}"); | ||||||
|  |                     if (_dicGetWhereCascadeSqlError.ContainsKey(errorKey)) continue; | ||||||
|  |  | ||||||
|  |                     var visitor = new NewExpressionVisitor(newParameter, fl.Parameters.FirstOrDefault()); | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         var andExp = visitor.Replace(fl.Body); | ||||||
|  |                         if (newExp == null) newExp = andExp; | ||||||
|  |                         else newExp = Expression.AndAlso(newExp, andExp); | ||||||
|  |                     } | ||||||
|  |                     catch | ||||||
|  |                     { | ||||||
|  |                         _dicGetWhereCascadeSqlError.TryAdd(errorKey, true); | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (newExp != null) | ||||||
|  |                     return ExpressionLambdaToSql(newExp, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias }); | ||||||
|  |             } | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public string formatSql(object obj, Type mapType) |         public string formatSql(object obj, Type mapType) | ||||||
|         { |         { | ||||||
|             return string.Concat(_ado.AddslashesProcessParam(obj, mapType)); |             return string.Concat(_ado.AddslashesProcessParam(obj, mapType)); | ||||||
|   | |||||||
| @@ -31,10 +31,26 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         protected DbTransaction _transaction; |         protected DbTransaction _transaction; | ||||||
|         protected DbConnection _connection; |         protected DbConnection _connection; | ||||||
|         protected Action<object> _trackToList; |         protected Action<object> _trackToList; | ||||||
|         protected Queue<Action<object>> _includeToList = new Queue<Action<object>>(); |         protected List<Action<object>> _includeToList = new List<Action<object>>(); | ||||||
|         protected bool _distinct; |         protected bool _distinct; | ||||||
|         protected Expression _selectExpression; |         protected Expression _selectExpression; | ||||||
|  |         protected List<LambdaExpression> _whereCascadeExpression = new List<LambdaExpression>(); | ||||||
|  |  | ||||||
|  |         bool _isDisponse = false; | ||||||
|  |         ~Select0Provider() | ||||||
|  |         { | ||||||
|  |             if (_isDisponse) return; | ||||||
|  |             _isDisponse = false; | ||||||
|  |             _where.Clear(); | ||||||
|  |             _params.Clear(); | ||||||
|  |             _tables.Clear(); | ||||||
|  |             _tableRules.Clear(); | ||||||
|  |             _join.Clear(); | ||||||
|  |             _trackToList = null; | ||||||
|  |             _includeToList.Clear(); | ||||||
|  |             _selectExpression = null; | ||||||
|  |             _whereCascadeExpression.Clear(); | ||||||
|  |         } | ||||||
|         public static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms) |         public static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms) | ||||||
|         { |         { | ||||||
|             var toType = to?.GetType(); |             var toType = to?.GetType(); | ||||||
| @@ -77,6 +93,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList); |             toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList); | ||||||
|             toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct); |             toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct); | ||||||
|             toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression); |             toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression); | ||||||
|  |             toType.GetField("_whereMultiExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public Select0Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) |         public Select0Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) | ||||||
| @@ -384,7 +401,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|                 var after = new Aop.CurdAfterEventArgs(before, exception, ret); |                 var after = new Aop.CurdAfterEventArgs(before, exception, ret); | ||||||
|                 _orm.Aop.CurdAfter?.Invoke(this, after); |                 _orm.Aop.CurdAfter?.Invoke(this, after); | ||||||
|             } |             } | ||||||
|             while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); |             foreach (var include in _includeToList) include?.Invoke(ret); | ||||||
|             _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); |             _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); | ||||||
|             _trackToList?.Invoke(ret); |             _trackToList?.Invoke(ret); | ||||||
|             return ret; |             return ret; | ||||||
| @@ -420,7 +437,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|                 var after = new Aop.CurdAfterEventArgs(before, exception, ret); |                 var after = new Aop.CurdAfterEventArgs(before, exception, ret); | ||||||
|                 _orm.Aop.CurdAfter?.Invoke(this, after); |                 _orm.Aop.CurdAfter?.Invoke(this, after); | ||||||
|             } |             } | ||||||
|             while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); |             foreach (var include in _includeToList) include?.Invoke(ret); | ||||||
|             _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); |             _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); | ||||||
|             _trackToList?.Invoke(ret); |             _trackToList?.Invoke(ret); | ||||||
|             return ret; |             return ret; | ||||||
| @@ -548,7 +565,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, newexp, null); |             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, newexp, null, _whereCascadeExpression); | ||||||
|             return (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null); |             return (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null); | ||||||
|         } |         } | ||||||
|         static ConcurrentDictionary<Type, ConstructorInfo> _dicConstructor = new ConcurrentDictionary<Type, ConstructorInfo>(); |         static ConcurrentDictionary<Type, ConstructorInfo> _dicConstructor = new ConcurrentDictionary<Type, ConstructorInfo>(); | ||||||
| @@ -944,13 +961,13 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = -10000; //临时规则,不返回 as1 |             var index = -10000; //临时规则,不返回 as1 | ||||||
|  |  | ||||||
|             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, columns, null); |             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, columns, null, _whereCascadeExpression); | ||||||
|             this.GroupBy(field.Length > 0 ? field.Remove(0, 2).ToString() : null); |             this.GroupBy(field.Length > 0 ? field.Remove(0, 2).ToString() : null); | ||||||
|             return new SelectGroupingProvider<TKey, TValue>(this, map, _commonExpression, _tables); |             return new SelectGroupingProvider<TKey, TValue>(this, map, _commonExpression, _tables); | ||||||
|         } |         } | ||||||
|         protected TSelect InternalJoin(Expression exp, SelectTableInfoType joinType) |         protected TSelect InternalJoin(Expression exp, SelectTableInfoType joinType) | ||||||
|         { |         { | ||||||
|             _commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null); |             _commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null, _whereCascadeExpression); | ||||||
|             return this as TSelect; |             return this as TSelect; | ||||||
|         } |         } | ||||||
|         protected TSelect InternalJoin<T2>(Expression exp, SelectTableInfoType joinType) |         protected TSelect InternalJoin<T2>(Expression exp, SelectTableInfoType joinType) | ||||||
| @@ -958,7 +975,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var tb = _commonUtils.GetTableByEntity(typeof(T2)); |             var tb = _commonUtils.GetTableByEntity(typeof(T2)); | ||||||
|             if (tb == null) throw new ArgumentException("T2 类型错误"); |             if (tb == null) throw new ArgumentException("T2 类型错误"); | ||||||
|             _tables.Add(new SelectTableInfo { Table = tb, Alias = $"IJ{_tables.Count}", On = null, Type = joinType }); |             _tables.Add(new SelectTableInfo { Table = tb, Alias = $"IJ{_tables.Count}", On = null, Type = joinType }); | ||||||
|             _commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null); |             _commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null, _whereCascadeExpression); | ||||||
|             return this as TSelect; |             return this as TSelect; | ||||||
|         } |         } | ||||||
|         protected TSelect InternalOrderBy(Expression column) => this.OrderBy(_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)); |         protected TSelect InternalOrderBy(Expression column) => this.OrderBy(_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)); | ||||||
| @@ -1027,7 +1044,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null); |             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression); | ||||||
|             return this.ToListMapReader<TReturn>((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); |             return this.ToListMapReader<TReturn>((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); | ||||||
|         } |         } | ||||||
|         async protected Task<TReturn> InternalToAggregateAsync<TReturn>(Expression select) |         async protected Task<TReturn> InternalToAggregateAsync<TReturn>(Expression select) | ||||||
| @@ -1036,11 +1053,11 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null); |             _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression); | ||||||
|             return (await this.ToListMapReaderAsync<TReturn>((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null))).FirstOrDefault(); |             return (await this.ToListMapReaderAsync<TReturn>((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null))).FirstOrDefault(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null)); |         protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null, _whereCascadeExpression)); | ||||||
|         #endregion |         #endregion | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -181,28 +181,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) |         ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this.Where(null); |             if (condition == false || exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; |             return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)) : this; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -321,9 +321,10 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             return this.InternalToAggregateAsync<TReturn>(select?.Body); |             return this.InternalToAggregateAsync<TReturn>(select?.Body); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public ISelect<T1> Where(Expression<Func<T1, bool>> exp) |         public ISelect<T1> Where(Expression<Func<T1, bool>> exp) => WhereIf(true, exp); | ||||||
|  |         public ISelect<T1> WhereIf(bool condition, Expression<Func<T1, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             _tables[0].Parameter = exp.Parameters[0]; |             _tables[0].Parameter = exp.Parameters[0]; | ||||||
|             return this.InternalWhere(exp?.Body); |             return this.InternalWhere(exp?.Body); | ||||||
|         } |         } | ||||||
| @@ -364,11 +365,10 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         } |         } | ||||||
|         public ISelect<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_tables.First().Table, $"{_tables.First().Alias}.", dywhere)); |         public ISelect<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_tables.First().Table, $"{_tables.First().Alias}.", dywhere)); | ||||||
|  |  | ||||||
|         public ISelect<T1> WhereIf(bool condition, Expression<Func<T1, bool>> exp) |         public ISelect<T1> WhereCascade(Expression<Func<T1, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (exp != null) _whereCascadeExpression.Add(exp); | ||||||
|             _tables[0].Parameter = exp.Parameters[0]; |             return this; | ||||||
|             return this.InternalWhere(exp?.Body); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public bool Any(Expression<Func<T1, bool>> exp) => this.Where(exp).Any(); |         public bool Any(Expression<Func<T1, bool>> exp) => this.Where(exp).Any(); | ||||||
| @@ -390,7 +390,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var tb = _commonUtils.GetTableByEntity(expBody.Type); |             var tb = _commonUtils.GetTableByEntity(expBody.Type); | ||||||
|             if (tb == null) throw new Exception("Include 参数类型错误"); |             if (tb == null) throw new Exception("Include 参数类型错误"); | ||||||
|  |  | ||||||
|             _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(expBody, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null); |             _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(expBody, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null); | ||||||
|             return this; |             return this; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -454,15 +454,13 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             if (tbNav == null) throw new Exception($"类型 {typeof(TNavigate).FullName} 错误,不能使用 IncludeMany"); |             if (tbNav == null) throw new Exception($"类型 {typeof(TNavigate).FullName} 错误,不能使用 IncludeMany"); | ||||||
|  |  | ||||||
|             if (collMem.Expression.NodeType != ExpressionType.Parameter) |             if (collMem.Expression.NodeType != ExpressionType.Parameter) | ||||||
|                 _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(collMem.Expression, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null); |                 _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(collMem.Expression, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null); | ||||||
|  |  | ||||||
|             TableRef tbref = null; |             TableRef tbref = null; | ||||||
|             var tbrefOneToManyColumns = new List<List<MemberExpression>>(); //临时 OneToMany 三个表关联,第三个表需要前两个表确定 |             var tbrefOneToManyColumns = new List<List<MemberExpression>>(); //临时 OneToMany 三个表关联,第三个表需要前两个表确定 | ||||||
|             if (whereExp == null) |             if (whereExp == null) | ||||||
|             { |             { | ||||||
|  |  | ||||||
|                 tbref = tb.GetTableRef(collMem.Member.Name, true); |                 tbref = tb.GetTableRef(collMem.Member.Name, true); | ||||||
|  |  | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
| @@ -563,8 +561,8 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|                 } |                 } | ||||||
|                 if (tbref.Columns.Any() == false) throw throwNavigateSelector; |                 if (tbref.Columns.Any() == false) throw throwNavigateSelector; | ||||||
|             } |             } | ||||||
|  |              | ||||||
|             _includeToList.Enqueue(listObj => |             _includeToList.Add(listObj => | ||||||
|             { |             { | ||||||
|                 var list = listObj as List<T1>; |                 var list = listObj as List<T1>; | ||||||
|                 if (list == null) return; |                 if (list == null) return; | ||||||
| @@ -621,6 +619,10 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|                 var subSelect = _orm.Select<TNavigate>().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider<TNavigate>; |                 var subSelect = _orm.Select<TNavigate>().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider<TNavigate>; | ||||||
|                 if (_tableRules?.Any() == true) |                 if (_tableRules?.Any() == true) | ||||||
|                     foreach (var tr in _tableRules) subSelect.AsTable(tr); |                     foreach (var tr in _tableRules) subSelect.AsTable(tr); | ||||||
|  |  | ||||||
|  |                 if (_whereCascadeExpression.Any()) | ||||||
|  |                     subSelect._whereCascadeExpression.AddRange(_whereCascadeExpression.ToArray()); | ||||||
|  |  | ||||||
|                 then?.Invoke(subSelect); |                 then?.Invoke(subSelect); | ||||||
|                 var subSelectT1Alias = subSelect._tables[0].Alias; |                 var subSelectT1Alias = subSelect._tables[0].Alias; | ||||||
|                 var oldWhere = subSelect._where.ToString(); |                 var oldWhere = subSelect._where.ToString(); | ||||||
| @@ -778,6 +780,11 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|                             { |                             { | ||||||
|                                 if (z > 0) sbJoin.Append(" AND "); |                                 if (z > 0) sbJoin.Append(" AND "); | ||||||
|                                 sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}"); |                                 sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}"); | ||||||
|  |                                 if (_whereCascadeExpression.Any()) { | ||||||
|  |                                     var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression); | ||||||
|  |                                     if (string.IsNullOrEmpty(cascade) == false) | ||||||
|  |                                         sbJoin.Append(" AND (").Append(cascade).Append(")"); | ||||||
|  |                                 } | ||||||
|                             } |                             } | ||||||
|                             subSelect.InnerJoin(sbJoin.ToString()); |                             subSelect.InnerJoin(sbJoin.ToString()); | ||||||
|                             sbJoin.Clear(); |                             sbJoin.Clear(); | ||||||
|   | |||||||
| @@ -157,28 +157,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2> ISelect<T1, T2>.WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp) |         ISelect<T1, T2> ISelect<T1, T2>.WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2>.Any(Expression<Func<T1, T2, bool>> exp) |         bool ISelect<T1, T2>.Any(Expression<Func<T1, T2, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2>.AnyAsync(Expression<Func<T1, T2, bool>> exp) |         Task<bool> ISelect<T1, T2>.AnyAsync(Expression<Func<T1, T2, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -160,28 +160,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3> ISelect<T1, T2, T3>.WhereIf(bool condition, Expression<Func<T1, T2, T3, bool>> exp) |         ISelect<T1, T2, T3> ISelect<T1, T2, T3>.WhereIf(bool condition, Expression<Func<T1, T2, T3, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3>.Any(Expression<Func<T1, T2, T3, bool>> exp) |         bool ISelect<T1, T2, T3>.Any(Expression<Func<T1, T2, T3, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3>.AnyAsync(Expression<Func<T1, T2, T3, bool>> exp) |         Task<bool> ISelect<T1, T2, T3>.AnyAsync(Expression<Func<T1, T2, T3, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -163,28 +163,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4> ISelect<T1, T2, T3, T4>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, bool>> exp) |         ISelect<T1, T2, T3, T4> ISelect<T1, T2, T3, T4>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4>.Any(Expression<Func<T1, T2, T3, T4, bool>> exp) |         bool ISelect<T1, T2, T3, T4>.Any(Expression<Func<T1, T2, T3, T4, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4>.AnyAsync(Expression<Func<T1, T2, T3, T4, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4>.AnyAsync(Expression<Func<T1, T2, T3, T4, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -166,28 +166,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5> ISelect<T1, T2, T3, T4, T5>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, bool>> exp) |         ISelect<T1, T2, T3, T4, T5> ISelect<T1, T2, T3, T4, T5>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5>.Any(Expression<Func<T1, T2, T3, T4, T5, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5>.Any(Expression<Func<T1, T2, T3, T4, T5, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -169,28 +169,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5, T6> ISelect<T1, T2, T3, T4, T5, T6>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) |         ISelect<T1, T2, T3, T4, T5, T6> ISelect<T1, T2, T3, T4, T5, T6>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5, T6>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5, T6>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5, T6>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5, T6>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -172,28 +172,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5, T6, T7> ISelect<T1, T2, T3, T4, T5, T6, T7>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) |         ISelect<T1, T2, T3, T4, T5, T6, T7> ISelect<T1, T2, T3, T4, T5, T6, T7>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5, T6, T7>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5, T6, T7>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -175,28 +175,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5, T6, T7, T8> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) |         ISelect<T1, T2, T3, T4, T5, T6, T7, T8> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -178,28 +178,28 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|         { |         { | ||||||
|             if (exp == null) return this.Where(null); |             if (exp == null) return this.Where(null); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) |         ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (condition == false || exp == null) return this; |             if (condition == false || exp == null) return this; | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) |         bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.Any(); |             if (exp == null) return this.Any(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).Any(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) |         Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) | ||||||
|         { |         { | ||||||
|             if (exp == null) return this.AnyAsync(); |             if (exp == null) return this.AnyAsync(); | ||||||
|             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; |             for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; | ||||||
|             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)).AnyAsync(); |             return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -84,7 +84,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|  |  | ||||||
|         public ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp) |         public ISelectGrouping<TKey, TValue> Having(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, bool>> exp) | ||||||
|         { |         { | ||||||
|             var sql = _comonExp.ExpressionWhereLambda(null, exp, getSelectGroupingMapString); |             var sql = _comonExp.ExpressionWhereLambda(null, exp, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("Having", new[] { typeof(string), typeof(object) }); |             var method = _select.GetType().GetMethod("Having", new[] { typeof(string), typeof(object) }); | ||||||
|             method.Invoke(_select, new object[] { sql, null }); |             method.Invoke(_select, new object[] { sql, null }); | ||||||
|             return this; |             return this; | ||||||
| @@ -92,7 +92,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|  |  | ||||||
|         public ISelectGrouping<TKey, TValue> OrderBy<TMember>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column) |         public ISelectGrouping<TKey, TValue> OrderBy<TMember>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column) | ||||||
|         { |         { | ||||||
|             var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString); |             var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); |             var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); | ||||||
|             method.Invoke(_select, new object[] { sql, null }); |             method.Invoke(_select, new object[] { sql, null }); | ||||||
|             return this; |             return this; | ||||||
| @@ -100,7 +100,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|  |  | ||||||
|         public ISelectGrouping<TKey, TValue> OrderByDescending<TMember>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column) |         public ISelectGrouping<TKey, TValue> OrderByDescending<TMember>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column) | ||||||
|         { |         { | ||||||
|             var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString); |             var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); |             var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); | ||||||
|             method.Invoke(_select, new object[] { $"{sql} DESC", null }); |             method.Invoke(_select, new object[] { $"{sql} DESC", null }); | ||||||
|             return this; |             return this; | ||||||
| @@ -112,7 +112,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString); |             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("ToListMapReader", BindingFlags.Instance | BindingFlags.NonPublic); |             var method = _select.GetType().GetMethod("ToListMapReader", BindingFlags.Instance | BindingFlags.NonPublic); | ||||||
|             method = method.MakeGenericMethod(typeof(TReturn)); |             method = method.MakeGenericMethod(typeof(TReturn)); | ||||||
|             return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as List<TReturn>; |             return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as List<TReturn>; | ||||||
| @@ -123,7 +123,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString); |             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); |             var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); | ||||||
|             method = method.MakeGenericMethod(typeof(TReturn)); |             method = method.MakeGenericMethod(typeof(TReturn)); | ||||||
|             return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as Task<List<TReturn>>; |             return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as Task<List<TReturn>>; | ||||||
| @@ -136,7 +136,7 @@ namespace FreeSql.Internal.CommonProvider | |||||||
|             var field = new StringBuilder(); |             var field = new StringBuilder(); | ||||||
|             var index = 0; |             var index = 0; | ||||||
|  |  | ||||||
|             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString); |             _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null); | ||||||
|             var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) }); |             var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) }); | ||||||
|             return method.Invoke(_select, new object[] { field.Length > 0 ? field.Remove(0, 2).ToString() : null }) as string; |             return method.Invoke(_select, new object[] { field.Length > 0 ? field.Remove(0, 2).ToString() : null }) as string; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -21,6 +21,8 @@ namespace FreeSql.Internal.Model | |||||||
|         public string NavigateCondition { get; set; } |         public string NavigateCondition { get; set; } | ||||||
|         public ParameterExpression Parameter { get; set; } |         public ParameterExpression Parameter { get; set; } | ||||||
|         public SelectTableInfoType Type { get; set; } |         public SelectTableInfoType Type { get; set; } | ||||||
|  |  | ||||||
|  |         public string Cascade { get; set; } | ||||||
|     } |     } | ||||||
|     public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } |     public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -41,6 +41,13 @@ namespace FreeSql.Internal | |||||||
|             if (typeof(IEnumerable).IsAssignableFrom(entity) && entity.IsGenericParameter == true) return null; |             if (typeof(IEnumerable).IsAssignableFrom(entity) && entity.IsGenericParameter == true) return null; | ||||||
|             if (entity.IsArray) return null; |             if (entity.IsArray) return null; | ||||||
|  |  | ||||||
|  |             object entityDefault = null; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (entity.IsAbstract == false && entity.IsInterface == false) | ||||||
|  |                     entityDefault = Activator.CreateInstance(entity); | ||||||
|  |             } | ||||||
|  |             catch { } | ||||||
|             var tbattr = common.GetEntityTableAttribute(entity); |             var tbattr = common.GetEntityTableAttribute(entity); | ||||||
|             trytb = new TableInfo(); |             trytb = new TableInfo(); | ||||||
|             trytb.Type = entity; |             trytb.Type = entity; | ||||||
| @@ -148,7 +155,8 @@ namespace FreeSql.Internal | |||||||
|                     trytb.ColumnsByCsIgnore.Add(p.Name, col); |                     trytb.ColumnsByCsIgnore.Add(p.Name, col); | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(Activator.CreateInstance(trytb.Type)); |                 if (entityDefault == null) entityDefault = Activator.CreateInstance(entity); | ||||||
|  |                 colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(entityDefault); | ||||||
|                 if (colattr.DbDefautValue != null && p.PropertyType != colattr.MapType) colattr.DbDefautValue = Utils.GetDataReaderValue(colattr.MapType, colattr.DbDefautValue); |                 if (colattr.DbDefautValue != null && p.PropertyType != colattr.MapType) colattr.DbDefautValue = Utils.GetDataReaderValue(colattr.MapType, colattr.DbDefautValue); | ||||||
|                 if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue; |                 if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue; | ||||||
|                 if (colattr.IsNullable == false && colattr.DbDefautValue == null) |                 if (colattr.IsNullable == false && colattr.DbDefautValue == null) | ||||||
|   | |||||||
| @@ -12,11 +12,15 @@ namespace FreeSql.MySql.Curd | |||||||
|     class MySqlSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class |     class MySqlSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         internal static string ToSqlStatic(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -33,8 +37,13 @@ namespace FreeSql.MySql.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -42,6 +51,7 @@ namespace FreeSql.MySql.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -61,11 +71,15 @@ namespace FreeSql.MySql.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -100,51 +114,51 @@ namespace FreeSql.MySql.Curd | |||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); MySqlSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class |     class MySqlSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class |     class MySqlSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class |     class MySqlSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class |     class MySqlSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class |     class MySqlSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class |     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class |     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class |     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class |     class MySqlSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class | ||||||
|     { |     { | ||||||
|         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public MySqlSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => MySqlSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net452</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net452</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 MySql 5.6</Description> | 		<Description>FreeSql 数据库实现,基于 MySql 5.6</Description> | ||||||
|   | |||||||
| @@ -97,7 +97,7 @@ namespace FreeSql.MySql | |||||||
|                 case "MygisPolygon": |                 case "MygisPolygon": | ||||||
|                 case "MygisMultiPoint": |                 case "MygisMultiPoint": | ||||||
|                 case "MygisMultiLineString": |                 case "MygisMultiLineString": | ||||||
|                 case "MygisMultiPolygon": return $"AsText({columnName})"; |                 case "MygisMultiPolygon": return $"ST_AsText({columnName})"; | ||||||
|             } |             } | ||||||
|             return columnName; |             return columnName; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 MySql 5.6</Description> | 		<Description>FreeSql 数据库实现,基于 MySql 5.6</Description> | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ namespace FreeSql.MySql | |||||||
|                 case "MygisPolygon": |                 case "MygisPolygon": | ||||||
|                 case "MygisMultiPoint": |                 case "MygisMultiPoint": | ||||||
|                 case "MygisMultiLineString": |                 case "MygisMultiLineString": | ||||||
|                 case "MygisMultiPolygon": return $"AsText({columnName})"; |                 case "MygisMultiPolygon": return $"ST_AsText({columnName})"; | ||||||
|             } |             } | ||||||
|             return columnName; |             return columnName; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -12,11 +12,15 @@ namespace FreeSql.Oracle.Curd | |||||||
|     class OracleSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class |     class OracleSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         internal static string ToSqlStatic(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -35,8 +39,13 @@ namespace FreeSql.Oracle.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -44,6 +53,7 @@ namespace FreeSql.Oracle.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -63,11 +73,15 @@ namespace FreeSql.Oracle.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -75,13 +89,9 @@ namespace FreeSql.Oracle.Curd | |||||||
|                     sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")"); |                     sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")"); | ||||||
|             } |             } | ||||||
|             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)); |                 sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); | ||||||
|             } |  | ||||||
|             if (string.IsNullOrEmpty(_groupby) == false) |             if (string.IsNullOrEmpty(_groupby) == false) | ||||||
|             { |             { | ||||||
|                 sb.Append(_groupby); |                 sb.Append(_groupby); | ||||||
| @@ -116,51 +126,51 @@ namespace FreeSql.Oracle.Curd | |||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); OracleSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class |     class OracleSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class |     class OracleSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class |     class OracleSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class |     class OracleSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class |     class OracleSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class |     class OracleSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class |     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class |     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class |     class OracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class | ||||||
|     { |     { | ||||||
|         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public OracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => OracleSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 Oracle 11</Description> | 		<Description>FreeSql 数据库实现,基于 Oracle 11</Description> | ||||||
|   | |||||||
| @@ -12,11 +12,15 @@ namespace FreeSql.PostgreSQL.Curd | |||||||
|     class PostgreSQLSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class |     class PostgreSQLSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         internal static string ToSqlStatic(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -33,8 +37,13 @@ namespace FreeSql.PostgreSQL.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -42,6 +51,7 @@ namespace FreeSql.PostgreSQL.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -61,11 +71,15 @@ namespace FreeSql.PostgreSQL.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -102,51 +116,51 @@ namespace FreeSql.PostgreSQL.Curd | |||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); PostgreSQLSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class |     class PostgreSQLSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class |     class PostgreSQLSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class |     class PostgreSQLSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class |     class PostgreSQLSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class | ||||||
|     { |     { | ||||||
|         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public PostgreSQLSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => PostgreSQLSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 PostgreSQL 9.5</Description> | 		<Description>FreeSql 数据库实现,基于 PostgreSQL 9.5</Description> | ||||||
|   | |||||||
| @@ -12,17 +12,21 @@ namespace FreeSql.SqlServer.Curd | |||||||
|     class SqlServerSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class |     class SqlServerSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         internal static string ToSqlStatic(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|             => (_commonUtils as SqlServerUtils).IsSelectRowNumber ? |             => (_commonUtils as SqlServerUtils).IsSelectRowNumber ? | ||||||
|             ToSqlStaticRowNumber(_commonUtils, _select, _distinct, field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, tableRuleInvoke, _orm) : |             ToSqlStaticRowNumber(_commonUtils, _commonExpression, _select, _distinct, field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, tableRuleInvoke, _whereCascadeExpression, _orm) : | ||||||
|             ToSqlStaticOffsetFetchNext(_commonUtils, _select, _distinct, field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, tableRuleInvoke, _orm); |             ToSqlStaticOffsetFetchNext(_commonUtils, _commonExpression, _select, _distinct, field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, tableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|  |  | ||||||
|         #region SqlServer 2005 row_number |         #region SqlServer 2005 row_number | ||||||
|         internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -51,8 +55,13 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -60,6 +69,7 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -79,11 +89,15 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -111,11 +125,15 @@ namespace FreeSql.SqlServer.Curd | |||||||
|         #endregion |         #endregion | ||||||
|  |  | ||||||
|         #region SqlServer 2012+ offset feach next |         #region SqlServer 2012+ offset feach next | ||||||
|         internal static string ToSqlStaticOffsetFetchNext(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStaticOffsetFetchNext(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -134,8 +152,13 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -143,6 +166,7 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -162,11 +186,15 @@ namespace FreeSql.SqlServer.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -214,51 +242,51 @@ namespace FreeSql.SqlServer.Curd | |||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); SqlServerSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class |     class SqlServerSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class |     class SqlServerSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class |     class SqlServerSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class |     class SqlServerSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class |     class SqlServerSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class |     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class |     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class |     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class |     class SqlServerSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class | ||||||
|     { |     { | ||||||
|         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqlServerSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqlServerSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net451</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net451</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next</Description> | 		<Description>FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next</Description> | ||||||
|   | |||||||
| @@ -12,11 +12,15 @@ namespace FreeSql.Sqlite.Curd | |||||||
|     class SqliteSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class |     class SqliteSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         internal static string ToSqlStatic(CommonUtils _commonUtils, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, IFreeSql _orm) |         internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, Func<Type, string, string> tableRuleInvoke, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm) | ||||||
|         { |         { | ||||||
|             if (_orm.CodeFirst.IsAutoSyncStructure) |             if (_orm.CodeFirst.IsAutoSyncStructure) | ||||||
|                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); |                 _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray()); | ||||||
|  |  | ||||||
|  |             if (_whereCascadeExpression.Any()) | ||||||
|  |                 foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) | ||||||
|  |                     tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression); | ||||||
|  |  | ||||||
|             var sb = new StringBuilder(); |             var sb = new StringBuilder(); | ||||||
|             var sbnav = new StringBuilder(); |             var sbnav = new StringBuilder(); | ||||||
|             sb.Append(_select); |             sb.Append(_select); | ||||||
| @@ -33,8 +37,13 @@ namespace FreeSql.Sqlite.Curd | |||||||
|                     for (var b = 1; b < tbsfrom.Length; b++) |                     for (var b = 1; b < tbsfrom.Length; b++) | ||||||
|                     { |                     { | ||||||
|                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); |                         sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tbsfrom[b].Table.Type, tbsfrom[b].Table.DbName))).Append(" ").Append(tbsfrom[b].Alias); | ||||||
|                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On)) sb.Append(" ON 1 = 1"); |  | ||||||
|                         else sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); |                         if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             sb.Append(" ON ").Append(tbsfrom[b].NavigateCondition ?? tbsfrom[b].On); | ||||||
|  |                             if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")"); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -42,6 +51,7 @@ namespace FreeSql.Sqlite.Curd | |||||||
|                 { |                 { | ||||||
|                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); |                     if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")"); | ||||||
|                     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).Append(")"); | ||||||
|                 } |                 } | ||||||
|                 if (a < tbsfrom.Length - 1) sb.Append(", "); |                 if (a < tbsfrom.Length - 1) sb.Append(", "); | ||||||
|             } |             } | ||||||
| @@ -61,11 +71,15 @@ namespace FreeSql.Sqlite.Curd | |||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); |                 sb.Append(_commonUtils.QuoteSqlName(tableRuleInvoke(tb.Table.Type, tb.Table.DbName))).Append(" ").Append(tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); | ||||||
|  |                 if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")"); | ||||||
|                 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) sb.Append(_join); | ||||||
|  |  | ||||||
|             sbnav.Append(_where); |             sbnav.Append(_where); | ||||||
|  |             if (!string.IsNullOrEmpty(_tables[0].Cascade)) | ||||||
|  |                 sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")"); | ||||||
|  |  | ||||||
|             foreach (var tb in _tables) |             foreach (var tb in _tables) | ||||||
|             { |             { | ||||||
|                 if (tb.Type == SelectTableInfoType.Parent) continue; |                 if (tb.Type == SelectTableInfoType.Parent) continue; | ||||||
| @@ -100,51 +114,51 @@ namespace FreeSql.Sqlite.Curd | |||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } |         public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); SqliteSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; } | ||||||
|         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class |     class SqliteSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class |     class SqliteSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class |     class SqliteSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class |     class SqliteSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class |     class SqliteSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class |     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class |     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class |     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
|     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class |     class SqliteSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class | ||||||
|     { |     { | ||||||
|         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } |         public SqliteSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } | ||||||
|         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _orm); |         public override string ToSql(string field = null) => SqliteSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, TableRuleInvoke, _whereCascadeExpression, _orm); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | 		<TargetFrameworks>netstandard2.0;net45</TargetFrameworks> | ||||||
| 		<Version>0.7.12</Version> | 		<Version>0.7.13</Version> | ||||||
| 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||||
| 		<Authors>YeXiangQin</Authors> | 		<Authors>YeXiangQin</Authors> | ||||||
| 		<Description>FreeSql 数据库实现,基于 Sqlite 3.0</Description> | 		<Description>FreeSql 数据库实现,基于 Sqlite 3.0</Description> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 28810
					28810