From b97156b482a205ed25dc2b72a75bd65e30270353 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Thu, 24 Oct 2019 02:17:22 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IFreeSql.GlobalFilter?=
=?UTF-8?q?=20=E5=85=A8=E5=B1=80=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=9B=20-?=
=?UTF-8?q?=20=E7=A7=BB=E9=99=A4=20TableAttribute.SelectFilter=20=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 8 +--
.../DependencyInjection.cs | 0
.../FreeSqlRepositoryExtensions.cs} | 2 +-
.../MySqlConnector/Curd/MySqlSelectTest.cs | 2 +-
.../FreeSql.Tests.Provider.Odbc/UnitTest1.cs | 2 +-
.../DataAnnotations/MySqlFluentTest.cs | 6 +--
.../DataAnnotations/SqlServerFluentTest.cs | 6 +--
.../Sqlite/Curd/SqliteSelectTest.cs | 1 -
FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 20 ++++++-
FreeSql/DataAnnotations/TableAttribute.cs | 4 --
FreeSql/DataAnnotations/TableFluent.cs | 16 ------
FreeSql/FreeSql.xml | 52 +++++++++++++------
FreeSql/Interface/Curd/IDelete.cs | 7 +++
FreeSql/Interface/Curd/ISelect/ISelect0.cs | 7 +++
FreeSql/Interface/Curd/IUpdate.cs | 7 +++
FreeSql/Interface/IAop.cs | 2 +-
FreeSql/Interface/IFreeSql.cs | 7 +++
FreeSql/Internal/CommonExpression.cs | 26 ++++++++--
.../Internal/CommonProvider/DeleteProvider.cs | 36 ++++++++++++-
.../SelectProvider/Select0Provider.cs | 25 ++++++++-
.../SelectProvider/Select1Provider.cs | 5 +-
.../Internal/CommonProvider/UpdateProvider.cs | 28 ++++++++++
FreeSql/Internal/CommonUtils.cs | 3 --
FreeSql/Internal/GlobalFilter.cs | 43 +++++++++++++++
FreeSql/Internal/Model/TableInfo.cs | 1 -
FreeSql/Internal/UtilsExpressionTree.cs | 1 -
.../Curd/MySqlSelect.cs | 6 ---
.../FreeSql.Provider.MySql/MySqlProvider.cs | 3 +-
.../Default/Curd/OdbcSelect.cs | 6 ---
.../Default/OdbcProvider.cs | 3 +-
.../MySql/Curd/OdbcMySqlSelect.cs | 6 ---
.../MySql/OdbcMySqlProvider.cs | 3 +-
.../Oracle/Curd/OdbcOracleSelect.cs | 6 ---
.../Oracle/OdbcOracleProvider.cs | 3 +-
.../PostgreSQL/Curd/OdbcPostgreSQLSelect.cs | 6 ---
.../PostgreSQL/OdbcPostgreSQLProvider.cs | 3 +-
.../SqlServer/Curd/OdbcSqlServerSelect.cs | 12 -----
.../SqlServer/OdbcSqlServerProvider.cs | 3 +-
.../Curd/OracleSelect.cs | 6 ---
.../FreeSql.Provider.Oracle/OracleProvider.cs | 3 +-
.../Curd/PostgreSQLSelect.cs | 6 ---
.../PostgreSQLProvider.cs | 3 +-
.../Curd/SqlServerSelect.cs | 12 -----
.../SqlServerProvider.cs | 3 +-
.../Curd/SqliteSelect.cs | 6 ---
.../FreeSql.Provider.Sqlite/SqliteProvider.cs | 3 +-
46 files changed, 271 insertions(+), 148 deletions(-)
rename FreeSql.DbContext/Repository/{Extenssions => Extensions}/DependencyInjection.cs (100%)
rename FreeSql.DbContext/Repository/{Extenssions/FreeSqlRepositoryExtenssions.cs => Extensions/FreeSqlRepositoryExtensions.cs} (98%)
create mode 100644 FreeSql/Internal/GlobalFilter.cs
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 5ae14b30..8b5be7c7 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -256,7 +256,7 @@
-
+
返回默认仓库类
@@ -266,7 +266,7 @@
数据过滤 + 验证
-
+
返回默认仓库类,适用联合主键的仓储类
@@ -275,7 +275,7 @@
数据过滤 + 验证
-
+
返回仓库类
@@ -285,7 +285,7 @@
分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository
-
+
创建基于仓储功能的工作单元,务必使用 using 包含使用
diff --git a/FreeSql.DbContext/Repository/Extenssions/DependencyInjection.cs b/FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs
similarity index 100%
rename from FreeSql.DbContext/Repository/Extenssions/DependencyInjection.cs
rename to FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs
diff --git a/FreeSql.DbContext/Repository/Extenssions/FreeSqlRepositoryExtenssions.cs b/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs
similarity index 98%
rename from FreeSql.DbContext/Repository/Extenssions/FreeSqlRepositoryExtenssions.cs
rename to FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs
index bafda690..9570ebdb 100644
--- a/FreeSql.DbContext/Repository/Extenssions/FreeSqlRepositoryExtenssions.cs
+++ b/FreeSql.DbContext/Repository/Extensions/FreeSqlRepositoryExtensions.cs
@@ -3,7 +3,7 @@ using System;
using System.Linq.Expressions;
using System.Linq;
-public static class FreeSqlRepositoryExtenssions
+public static class FreeSqlRepositoryExtensions
{
///
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
index 66c05d41..792618fc 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
@@ -87,7 +87,7 @@ namespace FreeSql.Tests.MySqlConnector
public virtual ICollection Tags { get; set; }
}
- [Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
+ [Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/UnitTest1.cs
index f0abaf46..4af3bc73 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/UnitTest1.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/UnitTest1.cs
@@ -1003,7 +1003,7 @@ WHERE ROWNUM < 11";
}
- [Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
+ [Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]
diff --git a/FreeSql.Tests/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs b/FreeSql.Tests/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs
index 596a5dc1..efeca38c 100644
--- a/FreeSql.Tests/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs
@@ -68,21 +68,21 @@ namespace FreeSql.Tests.DataAnnotations
{
g.mysql.CodeFirst
//.ConfigEntity(a => {
- // a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
+ // a.Name("xxdkdkdk1");
// a.Property(b => b.Id).Name("Id22").IsIdentity(true);
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a =>
{
- a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
+ a.Name("xxdkdkdk1222");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity(a =>
{
- a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
+ a.Name("xxdkdkdk2");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
})
diff --git a/FreeSql.Tests/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs b/FreeSql.Tests/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs
index cd6aee48..67effce4 100644
--- a/FreeSql.Tests/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs
@@ -41,21 +41,21 @@ namespace FreeSql.Tests.DataAnnotations
{
_sqlserverFixture.SqlServer.CodeFirst
//.ConfigEntity(a => {
- // a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
+ // a.Name("xxdkdkdk1");
// a.Property(b => b.Id).Name("Id22").IsIdentity(true);
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a =>
{
- a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
+ a.Name("xxdkdkdk1222");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity(a =>
{
- a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
+ a.Name("xxdkdkdk2");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
})
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
index c95152cd..15702301 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
@@ -1106,7 +1106,6 @@ namespace FreeSql.Tests.Sqlite
[Fact]
public void Include_ManyToMany()
{
-
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs
index 7010bd98..214e0646 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs
@@ -15,6 +15,7 @@ using Zeus;
using Zeus.Domain.Enum;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
+using System.Threading;
namespace FreeSql.Tests
{
@@ -415,10 +416,27 @@ namespace FreeSql.Tests
}
public enum TestAddEnumType { 中国人, 日本人 }
+ public static AsyncLocal TenrantId { get; set; } = new AsyncLocal();
[Fact]
public void Test1()
{
+ //g.mysql.GlobalFilter
+ // .Apply("test1", a => a.Id == TenrantId.Value)
+ // .Apply("test2", a => a.Id == 111)
+ // .Apply("test3", a => a.Name == "11");
+
+ TenrantId.Value = Guid.NewGuid();
g.mysql.Select().ToList();
+ g.mysql.Select().DisableGlobalFilter("test1").ToList();
+ g.mysql.Select().DisableGlobalFilter().ToList();
+
+ g.mysql.Delete().Where(a => a.Id == Guid.Empty).ExecuteAffrows();
+ g.mysql.Delete().DisableGlobalFilter("test1").Where(a => a.Id == Guid.Empty).ExecuteAffrows();
+ g.mysql.Delete().DisableGlobalFilter().Where(a => a.Id == Guid.Empty).ExecuteAffrows();
+
+ g.mysql.Update().SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
+ g.mysql.Update().DisableGlobalFilter("test1").SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
+ g.mysql.Update().DisableGlobalFilter().SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
g.sqlite.Insert(new TestGuidId { xxx = "111" }).ExecuteAffrows();
g.sqlite.Insert(new TestGuidId { xxx = "222" }).ExecuteAffrows();
@@ -1217,7 +1235,7 @@ namespace FreeSql.Tests
}
- [Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
+ [Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]
diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs
index 7ec69bb0..b08b5c4f 100644
--- a/FreeSql/DataAnnotations/TableAttribute.cs
+++ b/FreeSql/DataAnnotations/TableAttribute.cs
@@ -16,10 +16,6 @@ namespace FreeSql.DataAnnotations
/// 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
///
public string OldName { get; set; }
- ///
- /// 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
- ///
- public string SelectFilter { get; set; }
internal bool? _DisableSyncStructure;
///
diff --git a/FreeSql/DataAnnotations/TableFluent.cs b/FreeSql/DataAnnotations/TableFluent.cs
index d29e94fa..633462b9 100644
--- a/FreeSql/DataAnnotations/TableFluent.cs
+++ b/FreeSql/DataAnnotations/TableFluent.cs
@@ -35,14 +35,6 @@ namespace FreeSql.DataAnnotations
_table.OldName = value;
return this;
}
- ///
- /// 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
- ///
- public TableFluent SelectFilter(string value)
- {
- _table.SelectFilter = value;
- return this;
- }
///
/// 禁用 CodeFirst 同步结构迁移
@@ -100,14 +92,6 @@ namespace FreeSql.DataAnnotations
_table.OldName = value;
return this;
}
- ///
- /// 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
- ///
- public TableFluent SelectFilter(string value)
- {
- _table.SelectFilter = value;
- return this;
- }
///
/// 禁用 CodeFirst 同步结构迁移
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 003ef946..19b0f167 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -192,11 +192,6 @@
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
-
-
- 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
-
-
禁用 CodeFirst 同步结构迁移
@@ -212,11 +207,6 @@
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
-
-
- 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
-
-
禁用 CodeFirst 同步结构迁移
@@ -241,11 +231,6 @@
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
-
-
- 查询过滤SQL,实现类似 a.IsDeleted = 1 功能
-
-
禁用 CodeFirst 同步结构迁移
@@ -669,6 +654,13 @@
主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+ 禁用全局过滤功能,不传参数时将禁用所有
+
+ 零个或多个过滤器名字
+
+
设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
@@ -1025,6 +1017,13 @@
参数
+
+
+ 禁用全局过滤功能,不传参数时将禁用所有
+
+ 零个或多个过滤器名字
+
+
按原生sql语法分组,GroupBy("concat(name, ?cc)", new { cc = 1 })
@@ -1763,6 +1762,13 @@
主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+ 禁用全局过滤功能,不传参数时将禁用所有
+
+ 零个或多个过滤器名字
+
+
设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
@@ -2147,7 +2153,7 @@
- Insert/Update自动值处理, e.Column.SetMapValue(
+ Insert/Update自动值处理
@@ -2495,6 +2501,15 @@
Dict:key=属性名,value=注释
+
+
+ 创建一个过滤器
+
+
+ 名字
+ 表达式
+
+
中间表,多对多
@@ -2797,5 +2812,10 @@
DbFirst 模式开发相关方法
+
+
+ 全局过滤设置,可默认附加为 Select/Update/Delete 条件
+
+
diff --git a/FreeSql/Interface/Curd/IDelete.cs b/FreeSql/Interface/Curd/IDelete.cs
index a9ba7831..8dfda266 100644
--- a/FreeSql/Interface/Curd/IDelete.cs
+++ b/FreeSql/Interface/Curd/IDelete.cs
@@ -62,6 +62,13 @@ namespace FreeSql
///
IDelete WhereDynamic(object dywhere);
+ ///
+ /// 禁用全局过滤功能,不传参数时将禁用所有
+ ///
+ /// 零个或多个过滤器名字
+ ///
+ IDelete DisableGlobalFilter(params string[] name);
+
///
/// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
///
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs
index e115fabf..fad3ebe2 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs
@@ -208,6 +208,13 @@ namespace FreeSql
///
TSelect WhereIf(bool condition, string sql, object parms = null);
+ ///
+ /// 禁用全局过滤功能,不传参数时将禁用所有
+ ///
+ /// 零个或多个过滤器名字
+ ///
+ TSelect DisableGlobalFilter(params string[] name);
+
///
/// 按原生sql语法分组,GroupBy("concat(name, ?cc)", new { cc = 1 })
///
diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs
index ff023c78..6b4d752a 100644
--- a/FreeSql/Interface/Curd/IUpdate.cs
+++ b/FreeSql/Interface/Curd/IUpdate.cs
@@ -131,6 +131,13 @@ namespace FreeSql
///
IUpdate WhereDynamic(object dywhere);
+ ///
+ /// 禁用全局过滤功能,不传参数时将禁用所有
+ ///
+ /// 零个或多个过滤器名字
+ ///
+ IUpdate DisableGlobalFilter(params string[] name);
+
///
/// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
///
diff --git a/FreeSql/Interface/IAop.cs b/FreeSql/Interface/IAop.cs
index ce18c3ae..1135b633 100644
--- a/FreeSql/Interface/IAop.cs
+++ b/FreeSql/Interface/IAop.cs
@@ -56,7 +56,7 @@ namespace FreeSql
EventHandler SyncStructureAfter { get; set; }
///
- /// Insert/Update自动值处理, e.Column.SetMapValue(
+ /// Insert/Update自动值处理
///
EventHandler AuditValue { get; set; }
}
diff --git a/FreeSql/Interface/IFreeSql.cs b/FreeSql/Interface/IFreeSql.cs
index f60fb182..e72033f9 100644
--- a/FreeSql/Interface/IFreeSql.cs
+++ b/FreeSql/Interface/IFreeSql.cs
@@ -1,6 +1,8 @@
using FreeSql;
+using FreeSql.Internal;
using System;
using System.Collections.Generic;
+using System.Linq.Expressions;
public interface IFreeSql : IFreeSql { }
@@ -112,4 +114,9 @@ public interface IFreeSql : IDisposable
/// DbFirst 模式开发相关方法
///
IDbFirst DbFirst { get; }
+
+ ///
+ /// 全局过滤设置,可默认附加为 Select/Update/Delete 条件
+ ///
+ GlobalFilter GlobalFilter { get; }
}
\ No newline at end of file
diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs
index bb2c63d0..1162d460 100644
--- a/FreeSql/Internal/CommonExpression.cs
+++ b/FreeSql/Internal/CommonExpression.cs
@@ -1205,10 +1205,14 @@ namespace FreeSql.Internal
var errorKey = FreeUtil.Sha1($"{tb.Table.Type.FullName},{fl.ToString()}");
if (_dicGetWhereCascadeSqlError.ContainsKey(errorKey)) continue;
- var visitor = new NewExpressionVisitor(newParameter, fl.Parameters.FirstOrDefault());
+ var visitor = new ReplaceVisitor();
try
{
- var expExp = visitor.Replace(fl.Body);
+ var expExp = Expression.Lambda(
+ typeof(Func<,>).MakeGenericType(tb.Table.Type, typeof(bool)),
+ new ReplaceVisitor().Modify(fl.Body, newParameter),
+ newParameter
+ );
var whereSql = ExpressionLambdaToSql(expExp, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
if (isEmpty == false)
sb.Append(" AND ");
@@ -1228,10 +1232,22 @@ namespace FreeSql.Internal
}
return null;
}
-
- public string formatSql(object obj, Type mapType)
+ class ReplaceVisitor : ExpressionVisitor
{
- return string.Concat(_ado.AddslashesProcessParam(obj, mapType));
+ private ParameterExpression parameter;
+ public Expression Modify(Expression expression, ParameterExpression parameter)
+ {
+ this.parameter = parameter;
+ return Visit(expression);
+ }
+ protected override Expression VisitMember(MemberExpression node)
+ {
+ if (node.Expression?.NodeType == ExpressionType.Parameter)
+ return Expression.Property(parameter, node.Member.Name);
+ return base.VisitMember(node);
+ }
}
+
+ public string formatSql(object obj, Type mapType) => string.Concat(_ado.AddslashesProcessParam(obj, mapType));
}
}
diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
index a28e7a75..dc25d95b 100644
--- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs
+++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
@@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
+using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
@@ -19,6 +20,7 @@ namespace FreeSql.Internal.CommonProvider
protected Func _tableRule;
protected StringBuilder _where = new StringBuilder();
protected int _whereTimes = 0;
+ protected List _whereGlobalFilter;
protected List _params = new List();
protected DbTransaction _transaction;
protected DbConnection _connection;
@@ -31,6 +33,7 @@ namespace FreeSql.Internal.CommonProvider
_table = _commonUtils.GetTableByEntity(typeof(T1));
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure();
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
protected void ClearData()
@@ -38,6 +41,7 @@ namespace FreeSql.Internal.CommonProvider
_where.Clear();
_whereTimes = 0;
_params.Clear();
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
public IDelete WithTransaction(DbTransaction transaction)
@@ -99,6 +103,24 @@ namespace FreeSql.Internal.CommonProvider
public IDelete WhereExists(ISelect select, bool notExists = false) where TEntity2 : class => this.Where($"{(notExists ? "NOT " : "")}EXISTS({select.ToSql("1")})");
public IDelete WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere));
+ public IDelete DisableGlobalFilter(params string[] name)
+ {
+ if (_whereGlobalFilter.Any() == false) return this;
+ if (name?.Any() != true)
+ {
+ _whereGlobalFilter.Clear();
+ return this;
+ }
+ foreach (var n in name)
+ {
+ if (n == null) continue;
+ var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
+ if (idx == -1) continue;
+ _whereGlobalFilter.RemoveAt(idx);
+ }
+ return this;
+ }
+
protected string TableRuleInvoke()
{
if (_tableRule == null) return _table.DbName;
@@ -123,6 +145,18 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
- public string ToSql() => _whereTimes <= 0 ? null : new StringBuilder().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" WHERE ").Append(_where).ToString();
+ public string ToSql()
+ {
+ if (_whereTimes <= 0) return null;
+ var sb = new StringBuilder().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" WHERE ").Append(_where);
+
+ if (_whereGlobalFilter.Any())
+ {
+ var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList());
+ if (string.IsNullOrEmpty(globalFilterCondi) == false)
+ sb.Append(" AND ").Append(globalFilterCondi);
+ }
+ return sb.ToString();
+ }
}
}
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
index 93321ad1..0136eb97 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
@@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider
protected bool _distinct;
protected Expression _selectExpression;
protected List _whereCascadeExpression = new List();
+ protected List _whereGlobalFilter;
bool _isDisponse = false;
~Select0Provider()
@@ -50,6 +51,8 @@ namespace FreeSql.Internal.CommonProvider
_includeToList.Clear();
_selectExpression = null;
_whereCascadeExpression.Clear();
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
+ _whereCascadeExpression.AddRange(_whereGlobalFilter.Select(a => a.Where));
}
public static void CopyData(Select0Provider from, object to, ReadOnlyCollection lambParms)
{
@@ -93,7 +96,8 @@ namespace FreeSql.Internal.CommonProvider
toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList);
toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct);
toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression);
- toType.GetField("_whereMultiExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
+ toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
+ toType.GetField("_whereGlobalFilter", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereGlobalFilter);
}
public Select0Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
@@ -884,6 +888,25 @@ namespace FreeSql.Internal.CommonProvider
if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
return this as TSelect;
}
+ public TSelect DisableGlobalFilter(params string[] name)
+ {
+ if (_whereGlobalFilter.Any() == false) return this as TSelect;
+ if (name?.Any() != true)
+ {
+ _whereCascadeExpression.RemoveRange(0, _whereGlobalFilter.Count);
+ _whereGlobalFilter.Clear();
+ return this as TSelect;
+ }
+ foreach (var n in name)
+ {
+ if (n == null) continue;
+ var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
+ if (idx == -1) continue;
+ _whereCascadeExpression.RemoveAt(idx);
+ _whereGlobalFilter.RemoveAt(idx);
+ }
+ return this as TSelect;
+ }
#region common
protected TMember InternalAvg(Expression exp) => this.ToList($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
index ba3fdbe7..15b20b4a 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
@@ -22,7 +22,8 @@ namespace FreeSql.Internal.CommonProvider
{
public Select1Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
{
-
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
+ _whereCascadeExpression.AddRange(_whereGlobalFilter.Select(a => a.Where));
}
protected ISelect InternalFrom(LambdaExpression lambdaExp)
@@ -575,7 +576,7 @@ namespace FreeSql.Internal.CommonProvider
foreach (var item in list)
setListValue(item, null);
- var subSelect = _orm.Select().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider;
+ var subSelect = _orm.Select().DisableGlobalFilter().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider;
if (_tableRules?.Any() == true)
foreach (var tr in _tableRules) subSelect.AsTable(tr);
diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs
index 1cd348f8..d98b6392 100644
--- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs
+++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs
@@ -23,6 +23,7 @@ namespace FreeSql.Internal.CommonProvider
protected TableInfo _table;
protected Func _tableRule;
protected StringBuilder _where = new StringBuilder();
+ protected List _whereGlobalFilter;
protected StringBuilder _set = new StringBuilder();
protected StringBuilder _setIncr = new StringBuilder();
protected List _params = new List();
@@ -41,6 +42,7 @@ namespace FreeSql.Internal.CommonProvider
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure();
IgnoreCanUpdate();
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
///
@@ -63,6 +65,7 @@ namespace FreeSql.Internal.CommonProvider
_params.Clear();
_paramsSource.Clear();
IgnoreCanUpdate();
+ _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
public IUpdate WithTransaction(DbTransaction transaction)
@@ -428,6 +431,24 @@ namespace FreeSql.Internal.CommonProvider
public IUpdate WhereExists(ISelect select, bool notExists = false) where TEntity2 : class => this.Where($"{(notExists ? "NOT " : "")}EXISTS({select.ToSql("1")})");
public IUpdate WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere));
+ public IUpdate DisableGlobalFilter(params string[] name)
+ {
+ if (_whereGlobalFilter.Any() == false) return this;
+ if (name?.Any() != true)
+ {
+ _whereGlobalFilter.Clear();
+ return this;
+ }
+ foreach (var n in name)
+ {
+ if (n == null) continue;
+ var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
+ if (idx == -1) continue;
+ _whereGlobalFilter.RemoveAt(idx);
+ }
+ return this;
+ }
+
protected string WhereCaseSource(string CsName, Func thenValue)
{
if (_source.Any() == false) return null;
@@ -611,6 +632,13 @@ namespace FreeSql.Internal.CommonProvider
if (_where.Length > 0)
sb.Append(_source.Any() ? _where.ToString() : _where.ToString().Substring(5));
+ if (_whereGlobalFilter.Any())
+ {
+ var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList());
+ if (string.IsNullOrEmpty(globalFilterCondi) == false)
+ sb.Append(" AND ").Append(globalFilterCondi);
+ }
+
if (_table.VersionColumn != null)
{
var versionCondi = WhereCaseSource(_table.VersionColumn.CsName, sqlval => sqlval);
diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs
index 656bd04a..cdfe4a34 100644
--- a/FreeSql/Internal/CommonUtils.cs
+++ b/FreeSql/Internal/CommonUtils.cs
@@ -85,7 +85,6 @@ namespace FreeSql.Internal
{
if (!string.IsNullOrEmpty(trytb.Name)) attr.Name = trytb.Name;
if (!string.IsNullOrEmpty(trytb.OldName)) attr.OldName = trytb.OldName;
- if (!string.IsNullOrEmpty(trytb.SelectFilter)) attr.SelectFilter = trytb.SelectFilter;
if (trytb._DisableSyncStructure != null) attr._DisableSyncStructure = trytb.DisableSyncStructure;
}
var attrs = type.GetCustomAttributes(typeof(TableAttribute), false);
@@ -95,12 +94,10 @@ namespace FreeSql.Internal
if (tryattr == null) continue;
if (!string.IsNullOrEmpty(tryattr.Name)) attr.Name = tryattr.Name;
if (!string.IsNullOrEmpty(tryattr.OldName)) attr.OldName = tryattr.OldName;
- if (!string.IsNullOrEmpty(tryattr.SelectFilter)) attr.SelectFilter = tryattr.SelectFilter;
if (tryattr._DisableSyncStructure != null) attr._DisableSyncStructure = tryattr.DisableSyncStructure;
}
if (!string.IsNullOrEmpty(attr.Name)) return attr;
if (!string.IsNullOrEmpty(attr.OldName)) return attr;
- if (!string.IsNullOrEmpty(attr.SelectFilter)) return attr;
if (attr._DisableSyncStructure != null) return attr;
return null;
}
diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs
new file mode 100644
index 00000000..40bab709
--- /dev/null
+++ b/FreeSql/Internal/GlobalFilter.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+
+namespace FreeSql.Internal
+{
+ public class GlobalFilter
+ {
+ ConcurrentDictionary _filters = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase);
+ int _id = 0;
+
+ public class Item
+ {
+ public int Id { get; internal set; }
+ public string Name { get; internal set; }
+ public LambdaExpression Where { get; internal set; }
+ }
+ ///
+ /// 创建一个过滤器
+ ///
+ ///
+ /// 名字
+ /// 表达式
+ ///
+ public GlobalFilter Apply(string name, Expression> where)
+ {
+ if (name == null) throw new ArgumentNullException(nameof(name));
+ if (where == null) return this;
+
+ _filters.TryGetValue(name, out var item);
+ if (item == null) item = new Item { Id = ++_id, Name = name };
+ item.Where = where;
+ _filters.AddOrUpdate(name, item, (_, __) => item);
+ return this;
+ }
+ public void Remove(string name) => _filters.TryRemove(name ?? throw new ArgumentNullException(nameof(name)), out var _);
+
+ public List- GetFilters() => _filters.Values.OrderBy(a => a.Id).ToList();
+ }
+}
diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs
index 398721a6..09223d1d 100644
--- a/FreeSql/Internal/Model/TableInfo.cs
+++ b/FreeSql/Internal/Model/TableInfo.cs
@@ -21,7 +21,6 @@ namespace FreeSql.Internal.Model
public string CsName { get; set; }
public string DbName { get; set; }
public string DbOldName { get; set; }
- public string SelectFilter { get; set; }
public bool DisableSyncStructure { get; set; }
public ColumnInfo VersionColumn { get; set; }
diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs
index 029d0518..9d55d00d 100644
--- a/FreeSql/Internal/UtilsExpressionTree.cs
+++ b/FreeSql/Internal/UtilsExpressionTree.cs
@@ -65,7 +65,6 @@ namespace FreeSql.Internal
trytb.DbName = trytb.DbName.ToUpper();
trytb.DbOldName = trytb.DbOldName?.ToUpper();
}
- trytb.SelectFilter = tbattr?.SelectFilter;
if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure;
var propsLazy = new List<(PropertyInfo, bool, bool)>();
var propsNavObjs = new List();
diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs
index b0a3bd8c..002698bc 100644
--- a/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs
+++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs
@@ -87,12 +87,6 @@ namespace FreeSql.MySql.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs
index 8617ef5e..1ce3cf0b 100644
--- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs
+++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs
@@ -69,9 +69,10 @@ namespace FreeSql.MySql
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~MySqlProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs
index 14e8c520..c233952c 100644
--- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs
+++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcSelect.cs
@@ -101,12 +101,6 @@ namespace FreeSql.Odbc.Default
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs
index 740fbfab..a0c38cd9 100644
--- a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs
+++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs
@@ -82,9 +82,10 @@ namespace FreeSql.Odbc.Default
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OdbcProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs
index 1d9707c3..a94e6935 100644
--- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs
+++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlSelect.cs
@@ -87,12 +87,6 @@ namespace FreeSql.Odbc.MySql
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs
index ccc5830e..d1fa229f 100644
--- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs
+++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs
@@ -47,9 +47,10 @@ namespace FreeSql.Odbc.MySql
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OdbcMySqlProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs
index 6d523552..db466e69 100644
--- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs
+++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs
@@ -89,12 +89,6 @@ namespace FreeSql.Odbc.Oracle
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0)
diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs
index be0e4c11..974bf391 100644
--- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs
+++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs
@@ -48,9 +48,10 @@ namespace FreeSql.Odbc.Oracle
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OdbcOracleProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs
index d980d39e..1e5a8fb1 100644
--- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs
+++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLSelect.cs
@@ -87,12 +87,6 @@ namespace FreeSql.Odbc.PostgreSQL
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs
index 5313d309..26da3b6d 100644
--- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs
+++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs
@@ -45,9 +45,10 @@ namespace FreeSql.Odbc.PostgreSQL
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OdbcPostgreSQLProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs
index a6cebe01..52f7322d 100644
--- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs
+++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs
@@ -105,12 +105,6 @@ namespace FreeSql.Odbc.SqlServer
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
@@ -211,12 +205,6 @@ namespace FreeSql.Odbc.SqlServer
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs
index 0f5c1203..a13e4e67 100644
--- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs
+++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs
@@ -53,9 +53,10 @@ namespace FreeSql.Odbc.SqlServer
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OdbcSqlServerProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs
index 517b14e3..26e7ce7f 100644
--- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs
+++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs
@@ -89,12 +89,6 @@ namespace FreeSql.Oracle.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0)
diff --git a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs
index f425a362..6f938cf6 100644
--- a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs
+++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs
@@ -43,9 +43,10 @@ namespace FreeSql.Oracle
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~OracleProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs
index a170aa5c..23a04138 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs
@@ -87,12 +87,6 @@ namespace FreeSql.PostgreSQL.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
index b781993f..50f25473 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
@@ -96,9 +96,10 @@ namespace FreeSql.PostgreSQL
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~PostgreSQLProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs
index ef13ba09..25a584b9 100644
--- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs
+++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs
@@ -105,12 +105,6 @@ namespace FreeSql.SqlServer.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
@@ -211,12 +205,6 @@ namespace FreeSql.SqlServer.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs
index 467f7c96..b9de151e 100644
--- a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs
+++ b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs
@@ -54,9 +54,10 @@ namespace FreeSql.SqlServer
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~SqlServerProvider()
{
this.Dispose();
diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs
index a5b3992b..74953e74 100644
--- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs
+++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs
@@ -87,12 +87,6 @@ namespace FreeSql.Sqlite.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
- foreach (var tb in _tables)
- {
- if (tb.Type == SelectTableInfoType.Parent) continue;
- if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
- sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
- }
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs
index ef67538b..9a8b665d 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs
@@ -42,9 +42,10 @@ namespace FreeSql.Sqlite
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
-
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
+ public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
+
~SqliteProvider()
{
this.Dispose();