update

28810
2020-08-28 22:04:43 +08:00
parent 225724e37b
commit c4fd9286ef
21 changed files with 148 additions and 128 deletions

2
AOP.md

@@ -135,6 +135,6 @@ fsql.Aop.ParseExpression += (s, e) => {
* [《CodeFirst模式之四类型映射》](https://github.com/2881099/FreeSql/wiki/%e7%b1%bb%e5%9e%8b%e6%98%a0%e5%b0%84)
* [《CodeFirst模式之五迁移结构》](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e8%bf%81%e7%a7%bb%e7%bb%93%e6%9e%84)
- [《DbFirst模式开发介绍》](https://github.com/2881099/FreeSql/wiki/DbFirst)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《过滤器、全局过滤器》](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)

@@ -272,7 +272,7 @@ DbContext.SaveChanges或者 Repository 对实体的 Insert/Update/Delete
## 参考资料
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](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)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)

@@ -53,7 +53,7 @@ FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+
* [过滤器](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)
* [AOP✨](https://github.com/2881099/FreeSql/wiki/AOP)
* [读写分离](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
* [租户](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
* [性能](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
* [*你不知道的功能✨*](https://github.com/2881099/FreeSql/wiki/%E9%AA%9A%E6%93%8D%E4%BD%9C)

@@ -182,7 +182,7 @@ SqlServer 提供的 output inserted 特性,在表使用了自增或数据库
- [《学习FreeSql之四查询数据》](https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2)
- [《优化之:延时加载》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](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)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)

@@ -41,7 +41,7 @@
* [过滤器](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)
* [AOP✨](https://github.com/2881099/FreeSql/wiki/AOP)
* [读写分离](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
* [租户](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
* [性能](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
* [*你不知道的功能✨*](https://github.com/2881099/FreeSql/wiki/%E9%AA%9A%E6%93%8D%E4%BD%9C)

@@ -153,7 +153,7 @@ using (var uowManager = new UnitOfWorkManager(fsql)) //使用 UnitOfWorkManager
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《读写分离》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)
- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)

@@ -1,109 +0,0 @@
## 分区
分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。把一张表的数据分成N多个区块这些区块可以在同一个磁盘上也可以在不同的磁盘上数据库不同实现方式有所不同。
与分表不同一张大表进行分区后他还是一张表不会变成二张表但是他存放数据的区块变多了。分区的概念我觉得就想突破磁盘I/O瓶颈想提高磁盘的读写能力来增加数据库的性能。
分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开发代码端来说是透明。
postgresql10以上的自动分区分表功能
1、首先创建主分区表:
```sql
create table fenbiao(
id int,
year varchar
) partition by list(year)
```
这里设置的是根据year列进行数据分表;创建后使用navicat是看不到的;
2.创建分表:
```sql
create table fenbiao_2017 partition of fenbiao for values in ('2017');
create table fenbiao_2018 partition of fenbiao for values in ('2018');
```
这样这两天数据会依靠规则插入到不同分表中,如果插入一条不符合规则的数据,则会报错误:no partition of relation "fenbiao" found for row.
## 分表
分表从表面意思上看呢就是把一张表分成N多个小表每一个小表都是完正的一张表。分表后数据都是存放在分表里总表只是一个外壳存取数据发生在一个一个的分表里面。
分表后单表的并发能力提高了磁盘I/O性能也提高了。并发能力为什么提高了呢因为查寻一次所花的时间变短了如果出现高并发的话总表可以根据不同 的查询,将并发压力分到不同的小表里面。
## 分库分表
分库分表把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。
数据库中的数据量不一定是可控的在未进行分库分表的情况下随着时间和业务的发展库中的表会越来越多表中的数据量也会越来越大相应地数据操作增删改查的开销也会越来越大另外一台服务器的资源CPU、磁盘、内存、IO等是有限的最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
## FreeSql.Repository 分表
FreeSql 提供 AsTable 分表的基础方法GuidRepository 作为分存式仓储将实现了分表与分库(不支持跨服务器分库)的封装。
```csharp
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_201903");
```
上面我们得到一个日志仓储按年月分表,使用它 CURD 最终会操作 Log_201903 表。
注意事项:
* v0.11.12以后的版本可以使用 CodeFirst 迁移分表;
* 不可在分表分库的实体类型中使用《延时加载》;
## 跨表查询
```csharp
var sql = fsql.Select<User>()
.AsTable((type, oldname) => "table_1")
.AsTable((type, oldname) => "table_2")
.AsTable((type, oldname) => "table_3")
.ToSql(a => a.Id);
```
得到SQL
```sql
select * from (SELECT a."Id" as1 FROM "table_1" a) ftb
UNION ALL
select * from (SELECT a."Id" as1 FROM "table_2" a) ftb
UNION ALL
select * from (SELECT a."Id" as1 FROM "table_3" a) ftb
```
多表查询:
```csharp
var sql = fsql.Select<User>().LeftJoin<UserGroup>((a,b) => a.UserGroupId == b.Id)
.AsTable((type, oldname) => oldname + "_1")
.AsTable((type, oldname) => oldname + "_2")
.AsTable((type, oldname) => oldname + "_3")
.ToSql(a => a.Id);
```
> 期待更多发散。。。
## 巧用AsTable
```csharp
var sql = fsql.Select<User>()
.AsTable((a, b) => "(select * from tb_topic where clicks > 10)")
.Page(1, 10).ToList()
```
> v1.0.1 ISelect 增加 WithSql("select * from user ...") 功能快速代理此方法
## 分库跨库
参数资料:[https://github.com/dotnetcore/FreeSql/issues/44](https://github.com/dotnetcore/FreeSql/issues/44)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)
- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)
- [《UnitOfWork》](https://github.com/2881099/FreeSql/wiki/%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83)
- [《学习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)
- [《优化之:延时加载》](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)

129
分库分表.md Normal file

@@ -0,0 +1,129 @@
## 理论知识
分表 - 从表面意思上看呢就是把一张表分成N多个小表每一个小表都是完正的一张表。分表后数据都是存放在分表里总表只是一个外壳存取数据发生在一个一个的分表里面。分表后单表的并发能力提高了磁盘I/O性能也提高了。并发能力为什么提高了呢因为查寻一次所花的时间变短了如果出现高并发的话总表可以根据不同 的查询,将并发压力分到不同的小表里面。
分库 - 把原本存储于一个库的数据分块存储到多个库上把原本存储于一个表的数据分块存储到多个表上。数据库中的数据量不一定是可控的在未进行分库分表的情况下随着时间和业务的发展库中的表会越来越多表中的数据量也会越来越大相应地数据操作增删改查的开销也会越来越大另外一台服务器的资源CPU、磁盘、内存、IO等是有限的最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
## 分表 AsTable
FreeSql 原生用法、FreeSql.Repository 仓储用法 都提供了 AsTable 方法对分表进行 CRUD 操作,例如:
```c#
var repo = fsql.GetRepository<Log>();
repo.AsTable(_ => $"{oldname}_201903"); //对 Log_201903 表 CRUD
repo.Insert(new Log { ... });
```
跨库,但是在同一个数据库服务器下,也可以使用 AsTable(_ => $"db2.dbo.{oldname}_201903")
```csharp
//跨表查询
var sql = fsql.Select<User>()
.AsTable((type, oldname) => "table_1")
.AsTable((type, oldname) => "table_2")
.ToSql(a => a.Id);
//select * from (SELECT a."Id" as1 FROM "table_1" a) ftb
//UNION ALL
//select * from (SELECT a."Id" as1 FROM "table_2" a) ftb
```
分表总结:
- 分表、相同服务器跨库 可以使用 AsTable 进行 CRUD
- AsTable CodeFirst 会自动创建不存在的分表;
- 不可在分表分库的实体类型中使用《延时加载》;
## 分库 IdleBus
IFreeSql 对应一个数据库分库是不是要定义N个 IFreeSql分库的租户场景那不要定义10000个
IdleBus 空闲对象管理容器有效组织对象重复利用自动创建、销毁解决【实例】过多且长时间占用的问题。有时候想做一个单例对象重复使用提升性能但是定义多了有的又可能一直空闲着占用资源。专门解决又想重复利用又想少占资源的场景。https://github.com/2881099/IdleBus
> dotnet add package IdleBus
```csharp
static IdleBus<IFreeSql> ib = new IdleBus<IFreeSql>(TimeSpan.FromMinutes(10));
ib.Register("db1", () => new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1").Build());
ib.Register("db2", () => new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str2").Build());
ib.Register("db3", () => new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, "str3").Build());
//...注册很多个
ib.Get("db1").Select<T>().Limit(10).ToList();
```
IdleBus 也是【单例】设计!主要的两个方法,注册,获取。使用 IdleBus 后应需要弱化 IFreeSql 的存在。
```csharp
public static class IdleBusExtesions
{
static AsyncLocal<string> asyncLocalTenantId = new AsyncLocal<string>();
public static IdleBus<IFreeSql> ChangeTenant(this IdleBus<IFreeSql> ib, string tenantId)
{
asyncLocalTenantId.Value = tenantId;
return ib;
}
public static IFreeSql Get(this IdleBus<IFreeSql> ib) => ib.Get(asyncLocalTenantId.Value ?? "db1");
public static IBaseRepository<T> GetRepository<T>(this IdleBus<IFreeSql> ib) where T : class => ib.Get().GetRepository<T>();
//-------------------------------------------------------
static void test()
{
IdleBus<IFreeSql> ib = null; //单例注入
var fsql = ib.Get(); //获取当前租户对应的 IFreeSql
var fsql00102 = ib.ChangeTenant("00102").Get(); //切换租户,后面的操作都是针对 00102
var songRepository = ib.GetRepository<Song>();
var detailRepository = ib.GetRepository<Detail>();
}
//-------------------------------------------------------
public static IServiceCollection AddIdleBusRepository(this IServiceCollection services, IdleBus<IFreeSql> ib, params Assembly[] assemblies)
{
services.AddSingleton(ib);
services.AddScoped(typeof(IBaseRepository<>), typeof(YourDefaultRepository<>));
services.AddScoped(typeof(BaseRepository<>), typeof(YourDefaultRepository<>));
services.AddScoped(typeof(IBaseRepository<,>), typeof(YourDefaultRepository<,>));
services.AddScoped(typeof(BaseRepository<,>), typeof(YourDefaultRepository<,>));
if (assemblies?.Any() == true)
foreach (var asse in assemblies) //批量注册
foreach (var repo in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(IBaseRepository).IsAssignableFrom(a)))
services.AddScoped(repo);
return services;
}
}
class YourDefaultRepository<T> : BaseRepository<T> where T : class
{
public YourDefaultRepository(IdleBus<IFreeSql> ib) : base(ib.Get(), null, null) { }
}
class YourDefaultRepository<T, TKey> : BaseRepository<T, TKey> where T : class
{
public YourDefaultRepository(IdleBus<IFreeSql> ib) : base(ib.Get(), null, null) { }
}
```
分表总结:
- 跨库 可以使用 ib.Get() 获取 IFreeSql 进行 CRUD
- 跨库 事务不好处理,注意了;
- 跨库 查询不好处理,注意了;
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)
- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)
- [《UnitOfWork》](https://github.com/2881099/FreeSql/wiki/%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83)
- [《学习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)
- [《优化之:延时加载》](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)

@@ -59,4 +59,4 @@ SqlServer 2012+ 版本,使用最新的 fetch next rows 分页;
- [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%bd)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)

@@ -60,5 +60,5 @@ fsql.Select<Topic>()
- [《优化之:贪婪加载》](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)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)

@@ -219,5 +219,5 @@ WHERE t1.IsDeleted = 0
- [《优化之:贪婪加载》](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)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)

@@ -59,7 +59,7 @@ FreeSql 除了支持基本的增删查改功能外,还支持基于现有数据
- [《数据库事务》](https://github.com/2881099/FreeSql/wiki/%e4%ba%8b%e5%8a%a1)
- [《使用读写分离》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《返回数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%95%b0%e6%8d%ae)
- [《优化之:延时加载》](https://github.com/2881099/FreeSql/wiki/%e5%bb%b6%e6%97%b6%e5%8a%a0%e8%bd%bd)

@@ -120,7 +120,7 @@ DbContext.SaveChanges或者 Repository 对实体的 Insert/Update/Delete
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《读写分离》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)
- [《过滤器、全局过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)

@@ -204,7 +204,7 @@ public void QueryList() {
- [《数据库事务》](https://github.com/2881099/FreeSql/wiki/%e4%ba%8b%e5%8a%a1)
- [《使用读写分离》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《返回数据》](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%95%b0%e6%8d%ae)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)

@@ -13,7 +13,7 @@ FreeSql在查询数据下足了功夫链式查询语法、多表查询、表
- [《Expression 表达式函数》](https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0)
- [《读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
## 特别介绍 WhereDynamicFilter

@@ -216,5 +216,5 @@ Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path
- [《优化之:贪婪加载》](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)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)

@@ -177,7 +177,7 @@ fsql.Insert<Topic>().MySqlIgnoreInto().AppendData(items).ExecuteAffrows();
- [《学习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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
## API

@@ -68,7 +68,7 @@ var reposTopic = orm.GetGuidRepository<Topic>(null, oldname => $"{oldname}{tenan
### 方案三:按租户分库
与方案二相同,只是表存储的位置不同,请查看 [《FreeSql.Repository 仓储》](https://github.com/2881099/FreeSql/wiki/Repository)、[《分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8)。
与方案二相同,只是表存储的位置不同,请查看 [《FreeSql.Repository 仓储》](https://github.com/2881099/FreeSql/wiki/Repository)、[《分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)。
### 多表查询

@@ -39,7 +39,7 @@ fsql.Select<T>().Master().WhereId(a => a.Id == 1).ToOne(); //强制读【主库
* [《CodeFirst模式之四类型映射》](https://github.com/2881099/FreeSql/wiki/%e7%b1%bb%e5%9e%8b%e6%98%a0%e5%b0%84)
* [《CodeFirst模式之五迁移结构》](https://github.com/2881099/FreeSql/wiki/CodeFirst#%e8%bf%81%e7%a7%bb%e7%bb%93%e6%9e%84)
- [《DbFirst模式开发介绍》](https://github.com/2881099/FreeSql/wiki/DbFirst)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8)
- [《分区、分表、分库》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《过滤器、全局过滤器》](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)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)

@@ -152,7 +152,7 @@ repo1.Select.ToSql()
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)
- [《读写分离》](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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP)
- [《仓储层Repository》](https://github.com/2881099/FreeSql/wiki/Repository)
- [《UnitOfWork》](https://github.com/2881099/FreeSql/wiki/%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83)

@@ -173,5 +173,5 @@ A, B, C 都有 idDto { id, a1, a2, b1, b2 }A.id 被映射。也可以指
- [《优化之:贪婪加载》](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)
- [《性能》](https://github.com/2881099/FreeSql/wiki/%e6%80%a7%e8%83%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/%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93)
- [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7)