diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/GlobalFilterTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/GlobalFilterTest.cs new file mode 100644 index 00000000..c800e65b --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Internal/GlobalFilterTest.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Dynamic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Xunit; + +namespace FreeSql.Tests.Internal +{ + + public class GlobalFilterTest + { + [Fact] + public void TestGlobalFilterTest() + { + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.SqlServer, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.[id], a.[TenrantId], a.[IsDeleted] +FROM [TestGFilter1] a +WHERE (a.[TenrantId] = 100) AND (a.[id] > 10) AND (a.[IsDeleted] = 1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.ShenTong, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 't')", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.QuestDb, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = true)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.PostgreSQL, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 't')", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Oracle, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.MySql, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.`id`, a.`TenrantId`, a.`IsDeleted` +FROM `TestGFilter1` a +WHERE (a.`TenrantId` = 100) AND (a.`id` > 10) AND (a.`IsDeleted` = 1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.MsAccess, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.[id], a.[TenrantId], a.[IsDeleted] +FROM [TestGFilter1] a +WHERE (a.[TenrantId] = 100) AND (a.[id] > 10) AND (a.[IsDeleted] = -1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.KingbaseES, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 't')", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Dameng, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.""id"", a.""TenrantId"", a.""IsDeleted"" +FROM ""TestGFilter1"" a +WHERE (a.""TenrantId"" = 100) AND (a.""id"" > 10) AND (a.""IsDeleted"" = 1)", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString( DataType.ClickHouse, "test") + .UseAdoConnectionPool(true) + .UseNoneCommandParameter(true) + .Build()) + { + fsql.GlobalFilter.ApplyOnly("softdelete", a => a.IsDeleted == true); + fsql.GlobalFilter.ApplyOnly("tenrant", a => a.TenrantId == 100, before: true); + + var sql = fsql.Select().Where(a => a.id > 10).ToSql(); + Assert.Equal(@"SELECT a.`id`, a.`TenrantId`, a.`IsDeleted` +FROM `TestGFilter1` a +WHERE (a.`TenrantId` = 100) AND (a.`id` > 10) AND (a.`IsDeleted` = 1)", sql); + } + } + + class TestGFilter1 + { + public int id { get; set; } + public int TenrantId { get; set; } + public bool IsDeleted { get; set; } + } + } +} diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index c5f89ce8..167985fd 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -4386,7 +4386,7 @@ BigApple -> bigapple - + 创建一个过滤器 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal @@ -4394,9 +4394,10 @@ 名字 表达式 + 条件在最前面 - + 创建一个动态过滤器,当 condition 返回值为 true 时才生效 场景:当登陆身份是管理员,则过滤条件不生效 @@ -4406,9 +4407,10 @@ 名字 委托,返回值为 true 时才生效 表达式 + 条件在最前面 - + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal @@ -4416,9 +4418,10 @@ 名字 表达式 + 条件在最前面 - + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) 场景:当登陆身份是管理员,则过滤条件不生效 @@ -4428,6 +4431,7 @@ 名字 委托,返回值为 true 时才生效 表达式 + 条件在最前面 @@ -6250,115 +6254,3 @@ -`0})"> - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 380ef480..5b0bcf35 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -2361,7 +2361,7 @@ namespace FreeSql.Internal } static ConcurrentDictionary> _dicGetWhereCascadeSqlError = new ConcurrentDictionary>(); - public string GetWhereCascadeSql(SelectTableInfo tb, List filters, bool isMultitb) + public string GetWhereCascadeSql(SelectTableInfo tb, IEnumerable filters, bool isMultitb) { if (filters.Any()) { diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs index 8089a3d8..17fc213c 100644 --- a/FreeSql/Internal/GlobalFilter.cs +++ b/FreeSql/Internal/GlobalFilter.cs @@ -19,6 +19,7 @@ namespace FreeSql.Internal internal Func Condition { get; set; } public LambdaExpression Where { get; internal set; } public bool Only { get; internal set; } + public bool Before { get; internal set; } } /// /// 创建一个过滤器 @@ -27,8 +28,9 @@ namespace FreeSql.Internal /// /// 名字 /// 表达式 + /// 条件在最前面 /// - public GlobalFilter Apply(string name, Expression> where) => Apply(false, name, () => true, where); + public GlobalFilter Apply(string name, Expression> where, bool before = false) => Apply(false, name, () => true, where, before); /// /// 创建一个动态过滤器,当 condition 返回值为 true 时才生效 /// 场景:当登陆身份是管理员,则过滤条件不生效 @@ -38,8 +40,9 @@ namespace FreeSql.Internal /// 名字 /// 委托,返回值为 true 时才生效 /// 表达式 + /// 条件在最前面 /// - public GlobalFilter ApplyIf(string name, Func condition, Expression> where) => Apply(false, name, condition, where); + public GlobalFilter ApplyIf(string name, Func condition, Expression> where, bool before = false) => Apply(false, name, condition, where, before); /// /// 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) @@ -48,8 +51,9 @@ namespace FreeSql.Internal /// /// 名字 /// 表达式 + /// 条件在最前面 /// - public GlobalFilter ApplyOnly(string name, Expression> where) => Apply(true, name, () => true, where); + public GlobalFilter ApplyOnly(string name, Expression> where, bool before = false) => Apply(true, name, () => true, where, before); /// /// 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) /// 场景:当登陆身份是管理员,则过滤条件不生效 @@ -59,10 +63,11 @@ namespace FreeSql.Internal /// 名字 /// 委托,返回值为 true 时才生效 /// 表达式 + /// 条件在最前面 /// - public GlobalFilter ApplyOnlyIf(string name, Func condition, Expression> where) => Apply(true, name, condition, where); + public GlobalFilter ApplyOnlyIf(string name, Func condition, Expression> where, bool before = false) => Apply(true, name, condition, where, before); - GlobalFilter Apply(bool only, string name, Func condition, Expression> where) + GlobalFilter Apply(bool only, string name, Func condition, Expression> where, bool before) { if (name == null) throw new ArgumentNullException(nameof(name)); if (where == null) return this; @@ -78,6 +83,7 @@ namespace FreeSql.Internal item.Where = newlambda; item.Condition = condition; item.Only = only; + item.Before = before; _filters.AddOrUpdate(name, item, (_, __) => item); return this; } diff --git a/FreeSql/Internal/Model/SelectTableInfo.cs b/FreeSql/Internal/Model/SelectTableInfo.cs index f288a583..eb1df4cd 100644 --- a/FreeSql/Internal/Model/SelectTableInfo.cs +++ b/FreeSql/Internal/Model/SelectTableInfo.cs @@ -23,6 +23,7 @@ namespace FreeSql.Internal.Model public SelectTableInfoType Type { get; set; } public string Cascade { get; set; } + public string CascadeBefore { get; set; } } public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, RawJoin, Parent } } diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs index e0988d57..868414c9 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs @@ -22,7 +22,10 @@ namespace FreeSql.ClickHouse.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -48,22 +51,22 @@ namespace FreeSql.ClickHouse.Curd { sb.Append(" \r\nGLOBAL LEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.ClickHouse.Curd sb.Append(" \r\nGLOBAL RIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs index adba808e..d8dadbdb 100644 --- a/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs +++ b/Providers/FreeSql.Provider.Custom/Curd/CustomSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Custom if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -50,22 +53,22 @@ namespace FreeSql.Custom { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Custom sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlSelect.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlSelect.cs index 4a7cf054..df88e924 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlSelect.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Custom.MySql if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Custom.MySql { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Custom.MySql sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs index 3fbf9b58..ad62bf0d 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Custom.Oracle if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var sbunion = new StringBuilder(); @@ -51,22 +54,22 @@ namespace FreeSql.Custom.Oracle { sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sbunion.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); - else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -90,15 +93,20 @@ namespace FreeSql.Custom.Oracle sbunion.Append(" \r\nRIGHT JOIN "); break; } - sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sbunion.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLSelect.cs index 68628aef..7fc4161b 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Custom.PostgreSQL if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Custom.PostgreSQL { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Custom.PostgreSQL sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs index 6aa9cbb1..050527c7 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs @@ -26,7 +26,10 @@ namespace FreeSql.Custom.SqlServer if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -77,22 +80,22 @@ namespace FreeSql.Custom.SqlServer alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -117,15 +120,20 @@ namespace FreeSql.Custom.SqlServer break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { @@ -163,7 +171,10 @@ namespace FreeSql.Custom.SqlServer if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -193,22 +204,22 @@ namespace FreeSql.Custom.SqlServer alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -233,15 +244,20 @@ namespace FreeSql.Custom.SqlServer break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs index 344f2c41..443400bc 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Dameng.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var sbunion = new StringBuilder(); @@ -50,22 +53,22 @@ namespace FreeSql.Dameng.Curd { sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sbunion.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); - else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Dameng.Curd sbunion.Append(" \r\nRIGHT JOIN "); break; } - sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sbunion.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs index e1358a4a..07410bd2 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Firebird.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -50,22 +53,22 @@ namespace FreeSql.Firebird.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Firebird.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs index 11740f7e..73b07b5f 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.GBase.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -50,22 +53,22 @@ namespace FreeSql.GBase.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.GBase.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs index a54248f2..a6e6edc0 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.KingbaseES if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.KingbaseES { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.KingbaseES sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs index c58a9457..b12fa666 100644 --- a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs +++ b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessSelect.cs @@ -20,7 +20,10 @@ namespace FreeSql.MsAccess.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -53,23 +56,22 @@ namespace FreeSql.MsAccess.Curd if (ioinCounter++ > 0) sb.Insert(fromIndex, "(").Append(") "); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON (").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON (").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - sb.Append(")"); - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))).Append(")"); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -96,8 +98,13 @@ namespace FreeSql.MsAccess.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON (").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON (").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); sb.Append(")"); } @@ -114,9 +121,9 @@ namespace FreeSql.MsAccess.Curd }, RegexOptions.IgnoreCase)); } + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs index 8c2f0c0b..04762d02 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.MySql.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.MySql.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.MySql.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs index a56c5cd5..81d4ab32 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.Dameng if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var sbunion = new StringBuilder(); @@ -50,22 +53,22 @@ namespace FreeSql.Odbc.Dameng { sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sbunion.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); - else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Odbc.Dameng sbunion.Append(" \r\nRIGHT JOIN "); break; } - sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sbunion.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs index e367517b..b966c2f4 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.Default if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -50,22 +53,22 @@ namespace FreeSql.Odbc.Default { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Odbc.Default sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs index 0a3afbb3..4a4de884 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.KingbaseES if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Odbc.KingbaseES { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Odbc.KingbaseES sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs index 115dc0e6..8b3ee6ae 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.MySql if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Odbc.MySql { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Odbc.MySql sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs index 898f0c53..f1c46abd 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.Oracle if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var sbunion = new StringBuilder(); @@ -50,22 +53,22 @@ namespace FreeSql.Odbc.Oracle { sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sbunion.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); - else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -89,15 +92,20 @@ namespace FreeSql.Odbc.Oracle sbunion.Append(" \r\nRIGHT JOIN "); break; } - sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sbunion.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs index 14abbee6..fae51517 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Odbc.PostgreSQL if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Odbc.PostgreSQL { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Odbc.PostgreSQL sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 03a2b81c..b6683467 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -26,7 +26,10 @@ namespace FreeSql.Odbc.SqlServer if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -77,22 +80,22 @@ namespace FreeSql.Odbc.SqlServer alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -117,15 +120,20 @@ namespace FreeSql.Odbc.SqlServer break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { @@ -163,7 +171,10 @@ namespace FreeSql.Odbc.SqlServer if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -193,22 +204,22 @@ namespace FreeSql.Odbc.SqlServer alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -233,15 +244,20 @@ namespace FreeSql.Odbc.SqlServer break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs index f4db61dd..dc3eea2a 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Oracle.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var sbunion = new StringBuilder(); @@ -51,22 +54,22 @@ namespace FreeSql.Oracle.Curd { sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sbunion.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade); - else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -90,15 +93,20 @@ namespace FreeSql.Oracle.Curd sbunion.Append(" \r\nRIGHT JOIN "); break; } - sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade); + sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(onSql => string.IsNullOrEmpty(onSql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sbunion.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs index aece7ca7..bd109712 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.PostgreSQL.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.PostgreSQL.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbSelect.cs b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbSelect.cs index 0dd74268..5fa429ef 100644 --- a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbSelect.cs +++ b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbSelect.cs @@ -23,7 +23,10 @@ namespace FreeSql.QuestDb.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -55,29 +58,24 @@ namespace FreeSql.QuestDb.Curd if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && - string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { - 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) - sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); + 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); } if (a < tbsfrom.Length - 1) sb.Append(", "); @@ -100,20 +98,21 @@ namespace FreeSql.QuestDb.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ") - .Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ") - .Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); - if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) - sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); + if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition))sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs index 70772de1..7c20e11e 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.ShenTong.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.ShenTong.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.ShenTong.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index b19c51de..f12ac95e 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -26,7 +26,10 @@ namespace FreeSql.SqlServer.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -77,22 +80,22 @@ namespace FreeSql.SqlServer.Curd alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -117,15 +120,20 @@ namespace FreeSql.SqlServer.Curd break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { @@ -163,7 +171,10 @@ namespace FreeSql.SqlServer.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -193,22 +204,22 @@ namespace FreeSql.SqlServer.Curd alias = LocalGetTableAlias(tbsfrom[b].Table.Type, tbUnion[tbsfrom[b].Table.Type], tbsfrom[b].Alias, _aliasRule); sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) - { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] + { + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -233,15 +244,20 @@ namespace FreeSql.SqlServer.Curd break; } var alias = LocalGetTableAlias(tb.Table.Type, tbUnion[tb.Table.Type], tb.Alias, _aliasRule); - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs index 9d597515..ce8cfc0d 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Sqlite.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Sqlite.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Sqlite.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) { diff --git a/Providers/FreeSql.Provider.Xugu/Curd/XuguSelect.cs b/Providers/FreeSql.Provider.Xugu/Curd/XuguSelect.cs index c1c0e289..3dfa0ff4 100644 --- a/Providers/FreeSql.Provider.Xugu/Curd/XuguSelect.cs +++ b/Providers/FreeSql.Provider.Xugu/Curd/XuguSelect.cs @@ -19,7 +19,10 @@ namespace FreeSql.Xugu.Curd if (_whereGlobalFilter.Any()) foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent)) - tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); + { + tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == false), true); + tb.CascadeBefore = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter.Where(a => a.Before == true), true); + } var sb = new StringBuilder(); var tbUnionsGt0 = tbUnions.Count > 1; @@ -45,22 +48,22 @@ namespace FreeSql.Xugu.Curd { sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); - if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); - else - { - var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; - sb.Append(" ON ").Append(onSql); - if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) + if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && + string.IsNullOrEmpty(tbsfrom[b].On) && + string.IsNullOrEmpty(tbsfrom[b].Cascade) && + string.IsNullOrEmpty(tbsfrom[b].CascadeBefore)) sb.Append(" ON 1 = 1"); + else sb.Append(" ON ").Append(string.Join(" AND ", new[] { - if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); - else sb.Append(" AND ").Append(tbsfrom[b].Cascade); - } - } + tbsfrom[b].CascadeBefore, + tbsfrom[b].NavigateCondition ?? tbsfrom[b].On, + tbsfrom[b].Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); } break; } else { + if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].CascadeBefore)) sbnav.Append(" AND ").Append(tbsfrom[a].CascadeBefore); 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 (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); @@ -84,15 +87,20 @@ namespace FreeSql.Xugu.Curd sb.Append(" \r\nRIGHT JOIN "); break; } - sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); - if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); + sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias) + .Append(" ON ").Append(string.Join(" AND ", new[] + { + tb.CascadeBefore, + tb.On ?? tb.NavigateCondition, + tb.Cascade + }.Where(sql => string.IsNullOrEmpty(sql) == false))); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); } if (_join.Length > 0) sb.Append(_join); + if (!string.IsNullOrEmpty(_tables[0].CascadeBefore)) sbnav.Append(" AND ").Append(_tables[0].CascadeBefore); sbnav.Append(_where); - if (!string.IsNullOrEmpty(_tables[0].Cascade)) - sbnav.Append(" AND ").Append(_tables[0].Cascade); + if (!string.IsNullOrEmpty(_tables[0].Cascade)) sbnav.Append(" AND ").Append(_tables[0].Cascade); if (sbnav.Length > 0) {