From 8ff9d69842a34164b5e79d5ee9c3144edb5dd4ee Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 20 May 2022 10:02:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Repository.DataFilter?= =?UTF-8?q?=20=E5=AF=B9=20GlobalFilter=20=E6=8E=A7=E5=88=B6=E6=97=A0?= =?UTF-8?q?=E6=95=88=E7=9A=84=20bug=EF=BC=9B#1028=20#846?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 12 ++ FreeSql.DbContext/FreeSql.DbContext.xml | 9 -- .../Repository/ContextSet/RepositoryDbSet.cs | 15 ++- .../Repository/DataFilter/DataFilter.cs | 108 ++++++++++++++++-- .../Repository/Repository/BaseRepository.cs | 9 ++ FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 10 ++ 6 files changed, 140 insertions(+), 23 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 1dad165e..4df5ae7c 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -289,6 +289,18 @@ namespace base_entity }); sql1 = sql1.Replace("INNER JOIN ", "FULL JOIN "); + //fsql.Select() + // .ToList(a => new + // { + // users1 = fsql.Select().Where(b => b.GroupId == a.Id).ToList(false), + // users2 = fsql.Select().Where(b => b.GroupId == a.Id).ToList(b => new + // { + // userid = b.Id, + // username = b.Username + // }), + // //users3 = fsql.Ado.Query("select * from user1 where groupid = @id", new { id = a.Id }) + // }); + fsql.UseJsonMap(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 20e648e6..38f8de9d 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -559,14 +559,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs index 159988a7..c5544d61 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -22,8 +22,9 @@ namespace FreeSql var filters = (_repo.DataFilter as DataFilter)._filters; foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression); - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray(); - if (disableFilter.Any()) select.DisableGlobalFilter(); + var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); + disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); + if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter.ToArray()); return select; } internal ISelect OrmSelectInternal(object dywhere) => OrmSelect(dywhere); @@ -39,8 +40,9 @@ namespace FreeSql throw new Exception($"FreeSql.Repository Update 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},更新的数据不符合 {_db.OrmOriginal.GetEntityString(_entityType, entity)}"); update.Where(filter.Value.Expression); } - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray(); - if (disableFilter.Any()) update.DisableGlobalFilter(); + var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); + disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); + if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter.ToArray()); return update; } internal IUpdate OrmUpdateInternal(IEnumerable entitys) => OrmUpdate(entitys); @@ -49,8 +51,9 @@ namespace FreeSql var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal); var filters = (_repo.DataFilter as DataFilter)._filters; foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression); - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray(); - if (disableFilter.Any()) delete.DisableGlobalFilter(); + var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); + disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); + if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter.ToArray()); return delete; } internal IDelete OrmDeleteInternal(object dywhere) => OrmDelete(dywhere); diff --git a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs b/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs index 2d472304..17db52ca 100644 --- a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs +++ b/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs @@ -1,8 +1,9 @@ -using System; -using System.Collections.Generic; +using FreeSql.Internal; +using System; using System.Collections.Concurrent; -using System.Linq.Expressions; +using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; namespace FreeSql { @@ -48,8 +49,14 @@ namespace FreeSql public Func ExpressionDelegate => _expressionDelegate ?? (_expressionDelegate = Expression?.Compile()); public bool IsEnabled { get; set; } } + internal class FilterItemByOrm + { + public GlobalFilter.Item Filter { get; set; } + public bool IsEnabled { get; set; } + } internal ConcurrentDictionary _filters = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); + internal ConcurrentDictionary _filtersByOrm = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); public IDataFilter Apply(string filterName, Expression> filterAndValidateExp) { @@ -67,6 +74,7 @@ namespace FreeSql if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); List restore = new List(); + List restoreByOrm = new List(); foreach (var name in filterName) { if (_filters.TryGetValue(name, out var tryfi)) @@ -77,12 +85,33 @@ namespace FreeSql tryfi.IsEnabled = false; } } + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm)) + { + if (tryfiByOrm.IsEnabled) + { + restoreByOrm.Add(name); + tryfiByOrm.IsEnabled = false; + } + } } - return new UsingAny(() => this.Enable(restore.ToArray())); + return new UsingAny(() => + { + restore.ForEach(name => + { + if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false) + tryfi.IsEnabled = true; + }); + restoreByOrm.ForEach(name => + { + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false) + tryfiByOrm.IsEnabled = true; + }); + }); } public IDisposable DisableAll() { List restore = new List(); + List restoreByOrm = new List(); foreach (var val in _filters) { if (val.Value.IsEnabled) @@ -91,7 +120,27 @@ namespace FreeSql val.Value.IsEnabled = false; } } - return new UsingAny(() => this.Enable(restore.ToArray())); + foreach (var val in _filtersByOrm) + { + if (val.Value.IsEnabled) + { + restoreByOrm.Add(val.Key); + val.Value.IsEnabled = false; + } + } + return new UsingAny(() => + { + restore.ForEach(name => + { + if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false) + tryfi.IsEnabled = true; + }); + restoreByOrm.ForEach(name => + { + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false) + tryfiByOrm.IsEnabled = true; + }); + }); } class UsingAny : IDisposable { @@ -111,6 +160,7 @@ namespace FreeSql if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); List restore = new List(); + List restoreByOrm = new List(); foreach (var name in filterName) { if (_filters.TryGetValue(name, out var tryfi)) @@ -121,12 +171,33 @@ namespace FreeSql tryfi.IsEnabled = true; } } + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm)) + { + if (tryfiByOrm.IsEnabled == false) + { + restoreByOrm.Add(name); + tryfiByOrm.IsEnabled = true; + } + } } - return new UsingAny(() => this.Disable(restore.ToArray())); + return new UsingAny(() => + { + restore.ForEach(name => + { + if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true) + tryfi.IsEnabled = false; + }); + restoreByOrm.ForEach(name => + { + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true) + tryfiByOrm.IsEnabled = false; + }); + }); } public IDisposable EnableAll() { List restore = new List(); + List restoreByOrm = new List(); foreach (var val in _filters) { if (val.Value.IsEnabled == false) @@ -135,13 +206,34 @@ namespace FreeSql val.Value.IsEnabled = true; } } - return new UsingAny(() => this.Disable(restore.ToArray())); + foreach (var val in _filtersByOrm) + { + if (val.Value.IsEnabled == false) + { + restoreByOrm.Add(val.Key); + val.Value.IsEnabled = true; + } + } + return new UsingAny(() => + { + restore.ForEach(name => + { + if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true) + tryfi.IsEnabled = false; + }); + restoreByOrm.ForEach(name => + { + if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true) + tryfiByOrm.IsEnabled = false; + }); + }); } public bool IsEnabled(string filterName) { if (filterName == null) return false; - return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : false; + return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : + _filtersByOrm.TryGetValue(filterName, out var tryfiByOrm) ? tryfiByOrm.IsEnabled : false; } ~DataFilter() => this.Dispose(); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 2ce3a6a3..694418c0 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -29,6 +29,15 @@ namespace FreeSql DataFilterUtil.SetRepositoryDataFilter(this, null); DataFilter.Apply("", filter); AsTable(asTable); + + fsql.GlobalFilter.GetFilters().ForEach(gf => + { + (DataFilter as DataFilter)._filtersByOrm.TryAdd(gf.Name, new DataFilter.FilterItemByOrm + { + Filter = gf, + IsEnabled = true + }); + }); } ~BaseRepository() => this.Dispose(); diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index c1c64f53..6eec06d4 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -382,6 +382,16 @@ namespace FreeSql.Tests var gft2 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); var gft3 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); + var repo1 = g.mysql.GetRepository(); + using (repo1.DataFilter.Disable("gft1", "gft2", "gft3")) + repo1.Get(Guid.NewGuid()); + var repo2 = g.mysql.GetRepository(); + using (repo2.DataFilter.Disable("gft1", "gft2", "gft3")) + repo2.Get(Guid.NewGuid()); + var repo3 = g.mysql.GetRepository(); + using (repo3.DataFilter.Disable("gft1", "gft2", "gft3")) + repo3.Get(Guid.NewGuid()); + g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); g.mysql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.Delete().Where("1=1").ExecuteAffrows();