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)
{