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();