From 196e910932ccd399b31d4ccfe51e23998e1bee27 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 12 Mar 2019 16:08:26 +0800 Subject: [PATCH] update --- FreeSql入门.md | 2 + Home.md | 1 + Repository.md | 49 +++------------------- _Sidebar.md | 1 + 事务.md | 1 + 修改.md | 1 + 分区分表.md | 1 + 分组聚合查询.md | 1 + 分页查询.md | 1 + 延时加载.md | 1 + 性能.md | 1 + 更新日志.md | 10 +++++ 查询.md | 1 + 添加.md | 1 + 租户.md | 61 +-------------------------- 缓存.md | 1 + 表达式函数.md | 1 + 读写分离.md | 1 + 贪婪加载.md | 1 + 过滤器.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 返回查询的数据.md | 1 + 21 files changed, 139 insertions(+), 103 deletions(-) create mode 100644 过滤器.md diff --git a/FreeSql入门.md b/FreeSql入门.md index e7c800f..c79a683 100644 --- a/FreeSql入门.md +++ b/FreeSql入门.md @@ -95,3 +95,5 @@ fsql.Delete() - [《学习FreeSql之二:删除数据》](https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) - [《学习FreeSql之三:修改数据》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) - [《学习FreeSql之四:查询数据》](https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2) +- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) \ No newline at end of file diff --git a/Home.md b/Home.md index 3781359..fbf06eb 100644 --- a/Home.md +++ b/Home.md @@ -37,6 +37,7 @@ FreeSql是一个功能强大的NETStandard库,用于对象关系映射程序(O * [延时加载](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) * [贪婪加载](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) * [仓储层Repository](https://github.com/2881099/FreeSql/wiki/Repository) + * [《过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) * [CodeFirst](https://github.com/2881099/FreeSql/wiki/CodeFirst) * [实体特性](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e5%ae%9e%e4%bd%93%e7%89%b9%e6%80%a7) * [外部配置实体](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e5%a4%96%e9%83%a8%e9%85%8d%e7%bd%ae%e5%ae%9e%e4%bd%93) diff --git a/Repository.md b/Repository.md index 583a40e..f7c7796 100644 --- a/Repository.md +++ b/Repository.md @@ -43,64 +43,26 @@ public class SongRepository : BaseRepository { ```csharp public IServiceProvider ConfigureServices(IServiceCollection services) { - services.AddSingleton(fsql); services.AddMvc(); var builder = new ContainerBuilder(); - //示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效 - builder.RegisterFreeRepository(filter => - filter.Apply("test", a => a.Title == DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId) - ); + builder.RegisterFreeRepository(); builder.Populate(services); var container = builder.Build(); return new AutofacServiceProvider(container); } -public class xxxx { - public int Id { get; set; } -} -public class Song { - [Column(IsIdentity = true)] - public int Id { get; set; } - public string Title { get; set; } -} //在控制器使用 -public SongsController(GuidRepository repos1, GuidRepository repos2) { +public SongsController(GuidRepository repos1) { } ``` > Autofac 注入方式实现了全局【过滤与验证】的设定,方便租户功能的设计; -第一次请求: - -repos1.Select.ToSql() -> "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)" - -repos2.Select.ToSql() ->"SELECT a."Id" \r\nFROM "xxxx" a" - -第二次请求: - -repos1.Select.ToSql() ->"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)" - -repos2.Select.ToSql() ->"SELECT a."Id" \r\nFROM "xxxx" a" - -//禁用过滤器 -repos1.DataFilter.Disable("test") - -repos1.Select.ToSql() -> "SELECT a."Id", a."Title" \r\nFROM "Song" a" - -1、注入的变量值在使用时有了动态变化,每次获取时都是新的(Thread.CurrentThread.ManagedThreadId); - -2、设定的全局过滤,若某实体不存在表达式函数中的字段时,不会生效(如上xxxx不存在Title); - -3、使用 DataFilter.Disable("test") 可临时关闭过滤器的效果,使用 DataFilter.Enable("test") 可重新开启; +更多资料:[《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) ## 过滤与验证 @@ -136,8 +98,6 @@ var logRepository = fsql.GetGuidRepository(null, oldname => $"{oldname}_{Da * 不能使用 CodeFirst 迁移分表,开发环境时仍然可以迁移 Log 表; * 不可在分表分库的实体类型中使用《延时加载》; -## - ## 兼容问题 FreeSql 支持五种数据库,分别为 MySql/SqlServer/PostgreSQL/Oracle/Sqlite,虽然他们都为关系型数据库,但各自有着独特的技术亮点,有许多亮点值得我们使用; @@ -171,4 +131,5 @@ Task InsertAsync(TEntity entity); - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8) -- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) \ No newline at end of file +- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) \ No newline at end of file diff --git a/_Sidebar.md b/_Sidebar.md index 06719da..292df3e 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -23,6 +23,7 @@ * [延时加载](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) * [贪婪加载](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) * [仓储层Repository](https://github.com/2881099/FreeSql/wiki/Repository) + * [《过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) * [CodeFirst](https://github.com/2881099/FreeSql/wiki/CodeFirst) * [实体特性](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e5%ae%9e%e4%bd%93%e7%89%b9%e6%80%a7) * [外部配置实体](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e5%a4%96%e9%83%a8%e9%85%8d%e7%bd%ae%e5%ae%9e%e4%bd%93) diff --git a/事务.md b/事务.md index ad9167c..568bedb 100644 --- a/事务.md +++ b/事务.md @@ -74,6 +74,7 @@ ISelect、IInsert、IUpdate、IDelete,都支持 WithTransaction 方法。 - [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《学习FreeSql之一:添加数据》](https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0) - [《学习FreeSql之二:删除数据》](https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) - [《学习FreeSql之三:修改数据》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) diff --git a/修改.md b/修改.md index b805010..b2fd0c2 100644 --- a/修改.md +++ b/修改.md @@ -122,6 +122,7 @@ var t10 = update.SetRaw("Title = {0}", "新标题").Where("Id = {0}", 1).ToSql() - [《学习FreeSql之二:删除数据》](https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) - [《学习FreeSql之三:查询数据》](https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) # API diff --git a/分区分表.md b/分区分表.md index 6e8bfc9..4672d3e 100644 --- a/分区分表.md +++ b/分区分表.md @@ -58,6 +58,7 @@ var logRepository = fsql.GetGuidRepository(null, oldname => $"{oldname}_{Da - [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《学习FreeSql之一:添加数据》](https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0) - [《学习FreeSql之二:删除数据》](https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) - [《学习FreeSql之三:修改数据》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) diff --git a/分组聚合查询.md b/分组聚合查询.md index 7c93b2e..8e394a3 100644 --- a/分组聚合查询.md +++ b/分组聚合查询.md @@ -55,6 +55,7 @@ var groupby = fsql.Select() - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) diff --git a/分页查询.md b/分页查询.md index 3c2b84b..42a5c98 100644 --- a/分页查询.md +++ b/分页查询.md @@ -54,6 +54,7 @@ SqlServer 2012+ 版本,使用最新的 fetch next rows 分页; - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) diff --git a/延时加载.md b/延时加载.md index 578fa92..cae2750 100644 --- a/延时加载.md +++ b/延时加载.md @@ -121,6 +121,7 @@ limit 0,1)) - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) diff --git a/性能.md b/性能.md index 16acc68..58cbbf5 100644 --- a/性能.md +++ b/性能.md @@ -137,6 +137,7 @@ public void QueryList() { - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) diff --git a/更新日志.md b/更新日志.md index 6c3c005..cee8d4c 100644 --- a/更新日志.md +++ b/更新日志.md @@ -4,6 +4,16 @@ ## v0.3.13 - 修改 FreeSql.Repository Autofac 注入方式,真正的实现全局过滤功能; +- 增加 FreeSql.Repository DataFilter 属性; +```csharp +repos.DataFilter.Disable("test") 临时禁用,不影响全部; +repos.DataFilter.DisableAll() +repos.DataFilter.Enable("test") +repos.DataFilter.EnableAll() +repos.DataFilter.Apply("name", a => a.Id > 1) 附加新的过滤器 +``` + +repos.DataFilter.Apply 附加新的过滤器 ## v0.3.12 diff --git a/查询.md b/查询.md index 189956d..f61d3e5 100644 --- a/查询.md +++ b/查询.md @@ -7,6 +7,7 @@ FreeSql在查询数据下足了功能,链式查询语法、多表查询、表 - [《分组聚合查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e7%bb%84%e8%81%9a%e5%90%88%e6%9f%a5%e8%af%a2) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) diff --git a/添加.md b/添加.md index 708fdc9..a9b3dff 100644 --- a/添加.md +++ b/添加.md @@ -76,6 +76,7 @@ var t6 = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime - [《学习FreeSql之二:修改数据》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) - [《学习FreeSql之三:查询数据》](https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8) - [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) diff --git a/租户.md b/租户.md index 8a87cce..ade8481 100644 --- a/租户.md +++ b/租户.md @@ -64,65 +64,7 @@ LEFT JOIN "TopicType_1" b ON a."TypeId" = b."Id" FreeSql.Repository Autofac 注入方式实现了全局【过滤与验证】的设定,方便租户功能的设计; -```csharp -public IServiceProvider ConfigureServices(IServiceCollection services) { - - services.AddSingleton(fsql); - services.AddMvc(); - - var builder = new ContainerBuilder(); - - //示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效 - builder.RegisterFreeRepository(filter => - filter.Apply("test", a => a.Title == DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId) - ); - - builder.Populate(services); - var container = builder.Build(); - return new AutofacServiceProvider(container); -} - -public class xxxx { - public int Id { get; set; } -} -public class Song { - [Column(IsIdentity = true)] - public int Id { get; set; } - public string Title { get; set; } -} -//在控制器使用 -public SongsController(GuidRepository repos1, GuidRepository repos2) { -} -``` - -第一次请求: - -repos1.Select.ToSql() -> "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)" - -repos2.Select.ToSql() ->"SELECT a."Id" \r\nFROM "xxxx" a" - -第二次请求: - -repos1.Select.ToSql() ->"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)" - -repos2.Select.ToSql() ->"SELECT a."Id" \r\nFROM "xxxx" a" - -//禁用过滤器 -repos1.DataFilter.Disable("test") - -repos1.Select.ToSql() -> "SELECT a."Id", a."Title" \r\nFROM "Song" a" - -1、注入的变量值在使用时有了动态变化,每次获取时都是新的(Thread.CurrentThread.ManagedThreadId); - -2、设定的全局过滤,若某实体不存在表达式函数中的字段时,不会生效(如上xxxx不存在Title); - -3、使用 DataFilter.Disable("test") 可临时关闭过滤器的效果,使用 DataFilter.Enable("test") 可重新开启; -``` +具体可参考:[《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8); ## 参考资料 @@ -130,6 +72,7 @@ repos1.Select.ToSql() - [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《学习FreeSql之一:添加数据》](https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0) - [《学习FreeSql之二:删除数据》](https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) - [《学习FreeSql之三:修改数据》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) diff --git a/缓存.md b/缓存.md index 050e4b6..453cd15 100644 --- a/缓存.md +++ b/缓存.md @@ -38,6 +38,7 @@ Assert.Equal(result1.Count, result1.Count); - [《DbFirst模式之一:使用模板生成器》](https://github.com/2881099/FreeSql/wiki/DbFirst#%e7%94%9f%e6%88%90%e5%99%a8) - [《使用读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb) - [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) ## API diff --git a/表达式函数.md b/表达式函数.md index 31eb1d6..57424b7 100644 --- a/表达式函数.md +++ b/表达式函数.md @@ -227,6 +227,7 @@ var t2 = select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToSql(); - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) diff --git a/读写分离.md b/读写分离.md index 169e9ba..d8dba66 100644 --- a/读写分离.md +++ b/读写分离.md @@ -40,4 +40,5 @@ select.Master().WhereId(a => a.Id == 1).ToOne(); //强制读【主库】 - [《DbFirst模式之一:使用模板生成器》](https://github.com/2881099/FreeSql/wiki/DbFirst#%e7%94%9f%e6%88%90%e5%99%a8) - [《优化之:缓存之路》](https://github.com/2881099/FreeSql/wiki/%e7%bc%93%e5%ad%98) - [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) \ No newline at end of file diff --git a/贪婪加载.md b/贪婪加载.md index 2cd5277..01d6cdb 100644 --- a/贪婪加载.md +++ b/贪婪加载.md @@ -71,6 +71,7 @@ FreeSql 只实现了非常简单可靠的贪婪加载数据的方式,更精准 - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) diff --git a/过滤器.md b/过滤器.md new file mode 100644 index 0000000..64a09cb --- /dev/null +++ b/过滤器.md @@ -0,0 +1,104 @@ +FreeSql.Repository 实现了过滤器,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题。 + +## 过滤器 + +目前过滤器依附在仓储层实现,每个仓储实例都有 IDataFilter 属性,可利用期实现过滤器的管理,它是独立的修改后不影响全局。 + +```csharp +public interface IDataFilter where TEntity : class { + IDataFilter Apply(string filterName, Expression> filterAndValidateExp); + + IDataFilter Enable(params string[] filterName); + IDataFilter EnableAll(); + + IDataFilter Disable(params string[] filterName); + IDataFilter DisableAll(); + + bool IsEnabled(string filterName); +} +``` + +## 过滤与验证 + +假设我们有User(用户)、Topic(主题)两个实体,在领域类中定义了两个仓储: + +```csharp +var userRepository = fsql.GetGuidRepository(); +var topicRepository = fsql.GetGuidRepository(); +``` + +在开发过程中,总是担心 topicRepository 的数据安全问题,即有可能查询或操作到其他用户的主题。因此我们在v0.0.7版本进行了改进,增加了 filter lambad 表达式参数。 + +```csharp +var userRepository = fsql.GetGuidRepository(a => a.Id == 1); +var topicRepository = fsql.GetGuidRepository(a => a.UserId == 1); +``` + +* 在查询/修改/删除时附加此条件,从而达到不会修改其他用户的数据; +* 在添加时,使用表达式验证数据的合法性,若不合法则抛出异常; + +## 全局过滤器 + +全局过滤器,可帮助实现“软删除”、“租户”等设计,目前使用 Autofac 注入的方式实现的全局过滤器。 + +```csharp +public IServiceProvider ConfigureServices(IServiceCollection services) { + services.AddSingleton(fsql); + services.AddMvc(); + + var builder = new ContainerBuilder(); + + //示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效 + builder.RegisterFreeRepository(filter => + filter.Apply("test", a => a.Title == DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId) + ); + + builder.Populate(services); + var container = builder.Build(); + return new AutofacServiceProvider(container); +} + +public class xxxx { + public int Id { get; set; } +} +public class Song { + [Column(IsIdentity = true)] + public int Id { get; set; } + public string Title { get; set; } +} +//在控制器使用 +public SongsController(GuidRepository repos1, GuidRepository repos2) { + //在此打断点,调试 +} +``` + +第一次请求: + +repos1.Select.ToSql() +> "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)" + +repos2.Select.ToSql() +>"SELECT a."Id" \r\nFROM "xxxx" a" + +第二次请求: + +repos1.Select.ToSql() +>"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)" + +repos2.Select.ToSql() +>"SELECT a."Id" \r\nFROM "xxxx" a" + +//禁用过滤器 +repos1.DataFilter.Disable("test") + +repos1.Select.ToSql() +> "SELECT a."Id", a."Title" \r\nFROM "Song" a" + +1、注入的变量值在使用时有了动态变化,每次获取时都是新的(Thread.CurrentThread.ManagedThreadId); + +2、设定的全局过滤,若某实体不存在表达式函数中的字段时,不会生效(如上xxxx不存在Title); + +3、使用 DataFilter.Disable("test") 可临时关闭过滤器的效果,使用 DataFilter.Enable("test") 可重新开启; + +4、仓储对象创建时,从全局过滤器copy进来,然后自己管理自己。修改后不影响其他或全局设置。 + diff --git a/返回查询的数据.md b/返回查询的数据.md index ef43b36..03eae8a 100644 --- a/返回查询的数据.md +++ b/返回查询的数据.md @@ -125,6 +125,7 @@ List t9 = fsql.Ado.Query("select * from song"); - [《利用导航属性查询》](https://github.com/2881099/FreeSql/wiki/%e5%88%a9%e7%94%a8%e5%af%bc%e8%88%aa%e5%b1%9e%e6%80%a7) - [《获取查询返回的数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%9f%a5%e8%af%a2%e7%9a%84%e6%95%b0%e6%8d%ae) - [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository) +- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) - [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd) - [《优化之:贪婪加载》](https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd) - [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0)