mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-03 23:10:54 +08:00
update
@@ -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)
|
||||
1
Home.md
1
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)
|
||||
|
||||
@@ -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,虽然他们都为关系型数据库,但各自有着独特的技术亮点,有许多亮点值得我们使用;
|
||||
@@ -172,3 +132,4 @@ Task<TEntity> InsertAsync(TEntity entity);
|
||||
- [《优化之:贪婪加载》](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/%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)
|
||||
|
||||
1
事务.md
1
事务.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)
|
||||
|
||||
1
修改.md
1
修改.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
|
||||
|
||||
|
||||
1
分区分表.md
1
分区分表.md
@@ -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)
|
||||
|
||||
1
分页查询.md
1
分页查询.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)
|
||||
|
||||
1
延时加载.md
1
延时加载.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)
|
||||
|
||||
1
性能.md
1
性能.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)
|
||||
|
||||
10
更新日志.md
10
更新日志.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
|
||||
|
||||
|
||||
1
查询.md
1
查询.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)
|
||||
|
||||
1
添加.md
1
添加.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)
|
||||
|
||||
|
||||
61
租户.md
61
租户.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<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)
|
||||
|
||||
1
缓存.md
1
缓存.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
|
||||
|
||||
1
表达式函数.md
1
表达式函数.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)
|
||||
|
||||
1
读写分离.md
1
读写分离.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)
|
||||
1
贪婪加载.md
1
贪婪加载.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)
|
||||
|
||||
104
过滤器.md
Normal file
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)
|
||||
|
||||
Reference in New Issue
Block a user