update

28810
2019-03-12 16:08:26 +08:00
parent a8cce817a5
commit 196e910932
21 changed files with 139 additions and 103 deletions

@@ -95,3 +95,5 @@ fsql.Delete<Blog>()
- [《学习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)

@@ -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)

@@ -43,64 +43,26 @@ public class SongRepository : BaseRepository<Song, int> {
```csharp
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddSingleton<IFreeSql>(fsql);
services.AddMvc();
var builder = new ContainerBuilder();
//示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepository(filter =>
filter.Apply<Song>("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<Song> repos1, GuidRepository<xxxx> repos2) {
public SongsController(GuidRepository<Song> 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<Log>(null, oldname => $"{oldname}_{Da
* 不能使用 CodeFirst 迁移分表,开发环境时仍然可以迁移 Log 表;
* 不可在分表分库的实体类型中使用《延时加载》;
##
## 兼容问题
FreeSql 支持五种数据库,分别为 MySql/SqlServer/PostgreSQL/Oracle/Sqlite虽然他们都为关系型数据库但各自有着独特的技术亮点有许多亮点值得我们使用
@@ -171,4 +131,5 @@ Task<TEntity> 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)
- [《租户》](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)

@@ -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)

@@ -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)

@@ -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

@@ -58,6 +58,7 @@ var logRepository = fsql.GetGuidRepository<Log>(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)

@@ -55,6 +55,7 @@ var groupby = fsql.Select<Topic>()
- [《利用导航属性查询》](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)

@@ -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)

@@ -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)

@@ -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)

@@ -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

@@ -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)

@@ -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)

@@ -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<IFreeSql>(fsql);
services.AddMvc();
var builder = new ContainerBuilder();
//示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepository(filter =>
filter.Apply<Song>("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<Song> repos1, GuidRepository<xxxx> 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)

@@ -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

@@ -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)

@@ -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)

@@ -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)

104
过滤器.md Normal file

@@ -0,0 +1,104 @@
FreeSql.Repository 实现了过滤器,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题。
## 过滤器
目前过滤器依附在仓储层实现,每个仓储实例都有 IDataFilter 属性,可利用期实现过滤器的管理,它是独立的修改后不影响全局。
```csharp
public interface IDataFilter<TEntity> where TEntity : class {
IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp);
IDataFilter<TEntity> Enable(params string[] filterName);
IDataFilter<TEntity> EnableAll();
IDataFilter<TEntity> Disable(params string[] filterName);
IDataFilter<TEntity> DisableAll();
bool IsEnabled(string filterName);
}
```
## 过滤与验证
假设我们有User(用户)、Topic(主题)两个实体,在领域类中定义了两个仓储:
```csharp
var userRepository = fsql.GetGuidRepository<User>();
var topicRepository = fsql.GetGuidRepository<Topic>();
```
在开发过程中,总是担心 topicRepository 的数据安全问题即有可能查询或操作到其他用户的主题。因此我们在v0.0.7版本进行了改进,增加了 filter lambad 表达式参数。
```csharp
var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1);
var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
```
* 在查询/修改/删除时附加此条件,从而达到不会修改其他用户的数据;
* 在添加时,使用表达式验证数据的合法性,若不合法则抛出异常;
## 全局过滤器
全局过滤器,可帮助实现“软删除”、“租户”等设计,目前使用 Autofac 注入的方式实现的全局过滤器。
```csharp
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddSingleton<IFreeSql>(fsql);
services.AddMvc();
var builder = new ContainerBuilder();
//示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepository(filter =>
filter.Apply<Song>("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<Song> repos1, GuidRepository<xxxx> 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进来然后自己管理自己。修改后不影响其他或全局设置。

@@ -125,6 +125,7 @@ List<dynamic> t9 = fsql.Ado.Query<dynamic>("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)