diff --git a/FreeSql.Repository/DataFilter.cs b/FreeSql.Repository/DataFilter.cs index 2ad442a0..bdd9417f 100644 --- a/FreeSql.Repository/DataFilter.cs +++ b/FreeSql.Repository/DataFilter.cs @@ -10,11 +10,29 @@ namespace FreeSql { IDataFilter Apply(string filterName, Expression> filterAndValidateExp); - IDataFilter Enable(params string[] filterName); - IDataFilter EnableAll(); + /// + /// 开启过滤器,若使用 using 则使用完后,恢复为原有状态 + /// + /// 过滤器名称 + /// + IDisposable Enable(params string[] filterName); + /// + /// 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态 + /// + /// + IDisposable EnableAll(); - IDataFilter Disable(params string[] filterName); - IDataFilter DisableAll(); + /// + /// 禁用过滤器,若使用 using 则使用完后,恢复为原有状态 + /// + /// + /// + IDisposable Disable(params string[] filterName); + /// + /// 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态 + /// + /// + IDisposable DisableAll(); bool IsEnabled(string filterName); } @@ -40,34 +58,63 @@ namespace FreeSql { return this; } - public IDataFilter Disable(params string[] filterName) { - if (filterName == null || filterName.Any() == false) return this; + public IDisposable Disable(params string[] filterName) { + if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); + List restore = new List(); foreach (var name in filterName) { - if (_filters.TryGetValue(name, out var tryfi)) - tryfi.IsEnabled = false; + if (_filters.TryGetValue(name, out var tryfi)) { + if (tryfi.IsEnabled) { + restore.Add(name); + tryfi.IsEnabled = false; + } + } } - return this; + return new UsingAny(() => this.Enable(restore.ToArray())); } - public IDataFilter DisableAll() { - foreach (var val in _filters.Values.ToArray()) - val.IsEnabled = false; - return this; + public IDisposable DisableAll() { + List restore = new List(); + foreach (var val in _filters) { + if (val.Value.IsEnabled) { + restore.Add(val.Key); + val.Value.IsEnabled = false; + } + } + return new UsingAny(() => this.Enable(restore.ToArray())); + } + class UsingAny : IDisposable { + Action _ondis; + public UsingAny(Action ondis) { + _ondis = ondis; + } + public void Dispose() { + _ondis?.Invoke(); + } } - public IDataFilter Enable(params string[] filterName) { - if (filterName == null || filterName.Any() == false) return this; + public IDisposable Enable(params string[] filterName) { + if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); + List restore = new List(); foreach (var name in filterName) { - if (_filters.TryGetValue(name, out var tryfi)) - tryfi.IsEnabled = true; + if (_filters.TryGetValue(name, out var tryfi)) { + if (tryfi.IsEnabled == false) { + restore.Add(name); + tryfi.IsEnabled = true; + } + } } - return this; + return new UsingAny(() => this.Disable(restore.ToArray())); } - public IDataFilter EnableAll() { - foreach (var val in _filters.Values.ToArray()) - val.IsEnabled = true; - return this; + public IDisposable EnableAll() { + List restore = new List(); + foreach (var val in _filters) { + if (val.Value.IsEnabled == false) { + restore.Add(val.Key); + val.Value.IsEnabled = true; + } + } + return new UsingAny(() => this.Disable(restore.ToArray())); } public bool IsEnabled(string filterName) { diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 1a8905ec..6fef0a1a 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.13 + 0.3.13.1 YeXiangQin FreeSql 通用仓库层实现,支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite,读写分离、分表分库。 https://github.com/2881099/FreeSql diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index c26e6b82..7c138df2 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.13 + 0.3.13.1 true YeXiangQin 打造 .NETCore 最方便的 ORM,DbFirst 与 CodeFirst 混合使用,提供从实体同步数据库,或者从数据库生成实体代码,支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite,读写分离、分表分库。