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 1/3] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Repository.DataFil?= =?UTF-8?q?ter=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 1dad165ec..4df5ae7cd 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -289,6 +289,18 @@ static void Main(string[] args) }); 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 20e648e60..38f8de9d6 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 159988a77..c5544d611 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -22,8 +22,9 @@ protected override ISelect OrmSelect(object dywhere) 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 @@ protected override IUpdate OrmUpdate(IEnumerable entitys) 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 @@ protected override IDelete OrmDelete(object dywhere) 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 2d4723045..17db52ca5 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 @@ internal class FilterItem 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 @@ public IDisposable Disable(params string[] filterName) 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 @@ public IDisposable Disable(params string[] filterName) 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 @@ public IDisposable DisableAll() 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 @@ public IDisposable Enable(params string[] filterName) 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 @@ public IDisposable Enable(params string[] filterName) 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 @@ public IDisposable EnableAll() 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 2ce3a6a31..694418c06 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -29,6 +29,15 @@ protected BaseRepository(IFreeSql fsql, Expression> filter, 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 c1c64f53a..6eec06d44 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -382,6 +382,16 @@ public void Test02() 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(); From 5ba6bf101d43f785f22528c1c40cd7012ec3ae58 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 20 May 2022 10:07:53 +0800 Subject: [PATCH 2/3] v3.2.650-preview20220520 #1028 #846 --- Directory.Build.props | 2 +- FreeSql/FreeSql.xml | 183 ------------------------------------------ 2 files changed, 1 insertion(+), 184 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1fb4e5915..62ea88dc8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -9,7 +9,7 @@ - 3.2.650-preview20220518 + 3.2.650-preview20220520 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 208e9542a..00467660a 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3257,177 +3257,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 可自定义解析表达式 @@ -4322,12 +4151,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4403,12 +4226,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 From 04ba968b618ea846302f211ef16662e74c4fc2d9 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 20 May 2022 10:49:12 +0800 Subject: [PATCH 3/3] add test --- FreeSql.Tests/FreeSql.Tests/UnitTest5.cs | 12 ++ FreeSql/FreeSql.xml | 183 +++++++++++++++++++++++ 2 files changed, 195 insertions(+) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs index 19335b530..2e3f44bf6 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs @@ -16,6 +16,18 @@ namespace FreeSql.Tests { public class UnitTest5 { + + [Fact] + public void TestConstDtoStringEmpty() + { + var fsql = g.mysql; + var sql = fsql.Select().ToSql(a => new + { + empty = "" + }); + Assert.Equal(@"SELECT '' as1 +FROM `TestDto` a", sql); + } // DTO public class TestDto { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 00467660a..208e9542a 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3257,6 +3257,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4151,6 +4322,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4226,6 +4403,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发