This commit is contained in:
2881099 2021-04-19 04:32:27 +08:00
commit db701f006a
23 changed files with 584 additions and 4 deletions

58
.github/workflows/docfx.yml vendored Normal file
View File

@ -0,0 +1,58 @@
name: .NET Core Deploy Docfx
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Exclude example projects
run: dotnet sln FreeSql.sln remove Examples/**/*.csproj FreeSql.Tests/**/*.csproj
- name: Install dependencies
run: dotnet restore
- name: Build solution
run: dotnet build --configuration Release --no-restore
generate-docs:
runs-on: windows-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Remove Examples
run: dotnet sln FreeSql.sln remove (ls -r Examples/**/*.csproj)
- name: Remove FreeSql.Tests
run: dotnet sln FreeSql.sln remove (ls -r FreeSql.Tests/**/*.csproj)
- name: Install dependencies
run: dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org --configfile $env:APPDATA\NuGet\NuGet.Config && dotnet restore
- name: Setup DocFX
uses: crazy-max/ghaction-chocolatey@v1
with:
args: install docfx --version 2.56.7
- name: DocFX Build
working-directory: docs
run: docfx docfx.json
continue-on-error: false
- name: Publish
if: github.event_name == 'push'
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: docs/_site
force_orphan: true

View File

@ -63,6 +63,17 @@ namespace restful.Controllers
return _songRepository.Select.WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync(); return _songRepository.Select.WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync();
} }
/// <summary>
/// curl -X GET "http://localhost:5000/restapi/Songs/GetPagingItems?key=FreeSql&PageNumber=2&PageSize=10" -H "accept: text/plain"
/// </summary>
/// <param name="pagingInfo"></param>
/// <returns></returns>
[HttpGet("GetPagingItems")]
public Task<List<Song>> GetPagingItems([FromQuery] string key, [FromQuery] PagingInfo pagingInfo)
{
return _songRepository.Select.WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(pagingInfo).ToListAsync();
}
[HttpGet("{id}")] [HttpGet("{id}")]
public Task<Song> GetItem([FromRoute] int id) public Task<Song> GetItem([FromRoute] int id)
{ {

View File

@ -0,0 +1,57 @@
using FreeSql.Internal.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace repository_01
{
public class PagingInfo : BasePagingInfo
{
/// <summary>
/// 无参构造函数
/// </summary>
public PagingInfo()
{
}
/// <summary>
/// 当前为第1页每页大小的构造函数
/// </summary>
/// <param name="pageSize"></param>
public PagingInfo(int pageSize)
{
PageNumber = 1;
PageSize = pageSize;
}
/// <summary>
/// 带当前页和每页大小的构造函数
/// </summary>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
public PagingInfo(int pageNumber, int pageSize)
{
PageNumber = pageNumber;
PageSize = pageSize;
}
/// <summary>
/// 当前有多少页【只读】
/// </summary>
public long PageCount => PageSize == 0 ? 0 : (Count + PageSize - 1) / PageSize;
/// <summary>
/// 是否有上一页【只读】
/// </summary>
public bool HasPrevious => PageNumber > 1 && PageNumber <= PageCount;
/// <summary>
/// 是否有下一页【只读】
/// </summary>
public bool HasNext => PageNumber < PageCount;
/// <summary>
/// 是否在第一页【只读】
/// </summary>
public bool IsFrist => PageNumber == 1;
/// <summary>
/// 是否在最后一页【只读】
/// </summary>
public bool IsLast => PageNumber == PageCount;
}
}

View File

@ -25,6 +25,18 @@ namespace restful.Controllers
return _fsql.Select<Song>().WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync(); return _fsql.Select<Song>().WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync();
} }
/// <summary>
/// curl -X GET "http://localhost:5000/restapi/Songs/GetPagingItems?key=FreeSql&PageNumber=2&PageSize=10" -H "accept: text/plain"
/// </summary>
/// <param name="key"></param>
/// <param name="pagingInfo"></param>
/// <returns></returns>
[HttpGet("GetPagingItems")]
public Task<List<Song>> GetPagingItems([FromQuery] string key, [FromQuery] PagingInfo pagingInfo)
{
return _fsql.Select<Song>().WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(pagingInfo).ToListAsync();
}
[HttpGet("{id}")] [HttpGet("{id}")]
public Task<Song> GetItem([FromRoute] int id) public Task<Song> GetItem([FromRoute] int id)
{ {

View File

@ -0,0 +1,57 @@
using FreeSql.Internal.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace restful
{
public class PagingInfo : BasePagingInfo
{
/// <summary>
/// 无参构造函数
/// </summary>
public PagingInfo()
{
}
/// <summary>
/// 当前为第1页每页大小的构造函数
/// </summary>
/// <param name="pageSize"></param>
public PagingInfo(int pageSize)
{
PageNumber = 1;
PageSize = pageSize;
}
/// <summary>
/// 带当前页和每页大小的构造函数
/// </summary>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
public PagingInfo(int pageNumber, int pageSize)
{
PageNumber = pageNumber;
PageSize = pageSize;
}
/// <summary>
/// 当前有多少页【只读】
/// </summary>
public long PageCount => PageSize == 0 ? 0 : (Count + PageSize - 1) / PageSize;
/// <summary>
/// 是否有上一页【只读】
/// </summary>
public bool HasPrevious => PageNumber > 1 && PageNumber <= PageCount;
/// <summary>
/// 是否有下一页【只读】
/// </summary>
public bool HasNext => PageNumber < PageCount;
/// <summary>
/// 是否在第一页【只读】
/// </summary>
public bool IsFrist => PageNumber == 1;
/// <summary>
/// 是否在最后一页【只读】
/// </summary>
public bool IsLast => PageNumber == PageCount;
}
}

View File

@ -2136,6 +2136,13 @@
<param name="pageSize">每页多少</param> <param name="pageSize">每页多少</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.ISelect0`2.Page(FreeSql.Internal.Model.BasePagingInfo)">
<summary>
分页
</summary>
<param name="pagingInfo">分页信息</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelect0`2.Distinct"> <member name="M:FreeSql.ISelect0`2.Distinct">
<summary> <summary>
查询数据前,去重 查询数据前,去重
@ -2607,6 +2614,13 @@
<param name="pageSize">每页多少</param> <param name="pageSize">每页多少</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.ISelectGrouping`2.Page(FreeSql.Internal.Model.BasePagingInfo)">
<summary>
分页
</summary>
<param name="pagingInfo">分页信息</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelectGrouping`2.Count"> <member name="M:FreeSql.ISelectGrouping`2.Count">
<summary> <summary>
查询的记录数量 查询的记录数量
@ -3976,6 +3990,26 @@
<param name="commandTimeout"></param> <param name="commandTimeout"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:FreeSql.Internal.Model.BasePagingInfo">
<summary>
分页信息
</summary>
</member>
<member name="P:FreeSql.Internal.Model.BasePagingInfo.PageNumber">
<summary>
第几页从1开始
</summary>
</member>
<member name="P:FreeSql.Internal.Model.BasePagingInfo.PageSize">
<summary>
每页多少
</summary>
</member>
<member name="P:FreeSql.Internal.Model.BasePagingInfo.Count">
<summary>
查询的记录数量
</summary>
</member>
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Data"> <member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Data">
<summary> <summary>
当前操作的数据 当前操作的数据

View File

@ -402,6 +402,13 @@ namespace FreeSql
/// <returns></returns> /// <returns></returns>
TSelect Page(int pageNumber, int pageSize); TSelect Page(int pageNumber, int pageSize);
/// <summary>
/// 分页
/// </summary>
/// <param name="pagingInfo">分页信息</param>
/// <returns></returns>
TSelect Page(BasePagingInfo pagingInfo);
/// <summary> /// <summary>
/// 查询数据前,去重 /// 查询数据前,去重
/// <para> /// <para>

View File

@ -1,4 +1,5 @@
using System; using FreeSql.Internal.Model;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text; using System.Text;
@ -101,6 +102,13 @@ namespace FreeSql
/// <returns></returns> /// <returns></returns>
ISelectGrouping<TKey, TValue> Page(int pageNumber, int pageSize); ISelectGrouping<TKey, TValue> Page(int pageNumber, int pageSize);
/// <summary>
/// 分页
/// </summary>
/// <param name="pagingInfo">分页信息</param>
/// <returns></returns>
ISelectGrouping<TKey, TValue> Page(BasePagingInfo pagingInfo);
/// <summary> /// <summary>
/// 查询的记录数量 /// 查询的记录数量
/// </summary> /// </summary>

View File

@ -179,7 +179,7 @@ namespace FreeSql.Internal.CommonProvider
} }
if (val == null && col.Attribute.MapType == typeof(string) && col.Attribute.IsNullable == false) if (val == null && col.Attribute.MapType == typeof(string) && col.Attribute.IsNullable == false)
col.SetValue(data, val = ""); col.SetValue(data, val = "");
if (val == null && col.Attribute.MapType == typeof(byte[]) && col.Attribute.IsVersion) if (col.Attribute.MapType == typeof(byte[]) && (val == null || (val is byte[] bytes && bytes.Length == 0)) && col.Attribute.IsVersion)
col.SetValue(data, val = Utils.GuidToBytes(Guid.NewGuid())); col.SetValue(data, val = Utils.GuidToBytes(Guid.NewGuid()));
} }
} }

View File

@ -319,6 +319,13 @@ namespace FreeSql.Internal.CommonProvider
return this.Limit(pageSize) as TSelect; return this.Limit(pageSize) as TSelect;
} }
public TSelect Page(BasePagingInfo pagingInfo)
{
pagingInfo.Count = this.Count();
this.Skip(Math.Max(0, pagingInfo.PageNumber - 1) * pagingInfo.PageSize);
return this.Limit(pagingInfo.PageSize) as TSelect;
}
public TSelect Skip(int offset) public TSelect Skip(int offset)
{ {
_skip = offset; _skip = offset;

View File

@ -201,6 +201,14 @@ namespace FreeSql.Internal.CommonProvider
return this; return this;
} }
public ISelectGrouping<TKey, TValue> Page(BasePagingInfo pagingInfo)
{
pagingInfo.Count = this.Count();
_groupBySkip = Math.Max(0, pagingInfo.PageNumber - 1) * pagingInfo.PageSize;
_groupByLimit = pagingInfo.PageSize;
return this;
}
public long Count() => _select._cancel?.Invoke() == true ? 0 : long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray())), out var trylng) ? trylng : default(long); public long Count() => _select._cancel?.Invoke() == true ? 0 : long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray())), out var trylng) ? trylng : default(long);
public ISelectGrouping<TKey, TValue> Count(out long count) public ISelectGrouping<TKey, TValue> Count(out long count)
{ {

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace FreeSql.Internal.Model
{
/// <summary>
/// 分页信息
/// </summary>
public class BasePagingInfo
{
/// <summary>
/// 第几页从1开始
/// </summary>
public int PageNumber { get; set; }
/// <summary>
/// 每页多少
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 查询的记录数量
/// </summary>
public long Count { get; set; }
}
}

View File

@ -206,7 +206,7 @@ constantine,
L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、 L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、
无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、 无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、
*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k\*t 66元、蓝 100元 *礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k\*t 66元、蓝 100元、*菜 10元、生命如歌 1000元
> Thank you for your donation > Thank you for your donation

View File

@ -210,7 +210,7 @@ constantine,
L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、 L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、
无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、 无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、
*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k*t 66元、蓝 100元 *礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k*t 66元、蓝 100元、*菜 10元、生命如歌 1000元
> 超级感谢你的打赏。 > 超级感谢你的打赏。

15
docs/.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
###############
# folder #
###############
/**/DROP/
/**/TEMP/
/**/packages/
/**/bin/
/**/obj/
_site
/freesql/provider/*.yml
/freesql/provider/.manifest
/freesql/repository/*.yml
/freesql/repository/.manifest
/api/*.yml
/api/.manifest

14
docs/README.md Normal file
View File

@ -0,0 +1,14 @@
### DocFX
- https://dotnet.github.io/docfx/tutorial/docfx_getting_started.html
run
```
docfx docfx_project\docfx.json --serve
or
docfx .\docfx.json --serve
```

2
docs/api/index.md Normal file
View File

@ -0,0 +1,2 @@
# FreeSql
TODO: Add .NET projects to the *src* folder and run `docfx` to generate **REAL** *API Documentation*!

137
docs/docfx.json Normal file
View File

@ -0,0 +1,137 @@
{
"metadata": [
{
"src": [
{
"files": [
"FreeSql/*.csproj"
],
"exclude": [
"**/bin/**",
"**/obj/**"
],
"src": "../"
}
],
"dest": "api",
"disableGitFeatures": false,
"disableDefaultFilter": false
},
{
"src": [
{
"files": [
"FreeSql.DbContext/*.csproj",
"FreeSql.Repository/*.csproj"
],
"exclude": [
"**/bin/**",
"**/obj/**"
],
"src": "../"
}
],
"dest": "freesql/repository",
"disableGitFeatures": false,
"disableDefaultFilter": false
},
{
"src": [
{
"files": [
"Providers/FreeSql.Provider.MySql/*.csproj",
"Providers/FreeSql.Provider.Dameng/*.csproj",
"Providers/FreeSql.Provider.KingbaseES/*.csproj",
"Providers/FreeSql.Provider.MsAccess/*.csproj",
"Providers/FreeSql.Provider.MySqlConnector/*.csproj",
"Providers/FreeSql.Provider.Odbc/*.csproj",
"Providers/FreeSql.Provider.Oracle/*.csproj",
"Providers/FreeSql.Provider.PostgreSQL/*.csproj",
"Providers/FreeSql.Provider.ShenTong*.csproj",
"Providers/FreeSql.Provider.Sqlite/*.csproj",
"Providers/FreeSql.Provider.SqlServer/*.csproj",
"Providers/FreeSql.Provider.SqlServerForSystem/*.csproj"
],
"exclude": [
"**/bin/**",
"**/obj/**"
],
"src": "../"
}
],
"dest": "freesql/provider",
"disableGitFeatures": false,
"disableDefaultFilter": false
}
],
"build": {
"content": [
{
"files": [
"api/**.yml",
"api/index.md"
]
},
{
"files": [
"freesql/repository/**.yml",
"freesql/repository/index.md"
]
},
{
"files": [
"freesql/provider/**.yml",
"freesql/provider/index.md"
]
},
{
"files": [
"articles/**.md",
"articles/**/toc.yml",
"toc.yml",
"*.md"
]
}
],
"resource": [
{
"files": [
"images/**",
"styles/**"
]
}
],
"overwrite": [
{
"files": [
"Docs/**.md"
],
"exclude": [
"obj/**",
"_site/**"
]
}
],
"dest": "_site",
"globalMetadataFiles": [],
"fileMetadataFiles": [],
"template": [
"default"
],
"globalMetadata": {
"_appTitle": "FreeSql API Docs",
"_appLogoPath": "./images/logo.svg",
"_gitContribute": {
"repo": "https://github.com/dotnetcore/freesql",
"branch": "master"
},
"_enableSearch": true
},
"postProcessors": [],
"markdownEngineName": "markdig",
"noLangKeyword": false,
"keepFileLink": false,
"cleanupCacheHistory": false,
"disableGitFeatures": false
}
}

View File

View File

@ -0,0 +1,2 @@
# repository
TODO: Add .NET projects to the *src* folder and run `docfx` to generate **REAL** *API Documentation*!

104
docs/images/logo.svg Normal file
View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="194px" height="51px" viewBox="0 0 194 51" enable-background="new 0 0 194 51" xml:space="preserve"> <image id="image0" width="194" height="51" x="0" y="0"
href="data:image/png;base64,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
nb0MsToW8NWOjlEishqwVHUGcIdIHQ2MC66DKVtH1VPTA9cQedfPTtl8q4Ov4h35eJiPMQ0HDWYK
O3JIccUY85qIZHQYqap+UH2+ZIN3W1WPAb4QkYzWFGkH0NaU3SIid+dWGkcvqs1FK0xcVRa0lwGT
RaQ4rfxi4DciUlRf++TrD+O8/3dfuX38CGITfhFqxmpOWMCNqlqegYB2AZMI6cAVka3AlWHq1uLh
ADfXVoJqWvdVhx//v4eqHgDGAtOAPTmke1BVZ+L94k5x+vVqM/VkVb1TVes87zEyZHzgjrW75l2c
xU8FhW9/pZBqc+F4VV0kIvWelaiqW4FzROSTTBlVb6w9LCIN5d/tUdWrROTZOq7HgD+p6g8ammWq
F1wHRCSL1VzG49sHJEQk/MkB2fPaDVwiIjXZUm1V9RbgR0AHEckoRlxVE3g/v/VE9Yx7IGS7zsCt
wOVAYYopo0rihXtxVwUndEmHnp6btnX1MZ9qkFYdsPufXpu+4qV3DmiqQ4FVNQksk1p2s6jqBfU1
EpFXaMRWnqp2BIY2UG1xtaeoIVrHUn8SCCJyQFXXAIMbopcDrBSRzao6thl4vSkiQT/2EFHv98zO
AC7AC0muCwpsAJ4TkfXAPxvRn3xV/Q7wZO0HVsu3UfX4DV5SUAjYp4wjNu7mwx30XmT9gO5AVpn8
IbBTRFIU4Wt8jcbib8D3axeYkpVUzZkRaqFrn3IhsXE/PvS9WhE6pZvITYEjN1zzaxx1UNUbq822
Q7B6nUz8h7O8k7EbCJCTiN8j1hxKAIfXCF/ja+QEqjoOeD799+u06gBmzbs4H70BFTvQZKW3N2VH
kXiBdw7riIlY3QfWpmWa6wdDvlaEr5FriKreBvxbsFtXwXUPh2CLePsYAe5UVf1CRELnFjQG/wvc
g6v3Q852KwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wOS0wMVQwMDowMDozOCswODowMARjC9UA
AAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDktMDFUMDA6MDA6MzgrMDg6MDB1PrNpAAAAIHRFWHRz
b2Z0d2FyZQBodHRwczovL2ltYWdlbWFnaWNrLm9yZ7zPHZ0AAAAYdEVYdFRodW1iOjpEb2N1bWVu
dDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADQx/rw/iQAAABd0RVh0
VGh1bWI6OkltYWdlOjpXaWR0aAAxOTQ6z4Q9AAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2Uv
cG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE1OTg4ODk2MziXcjePAAAAEnRFWHRUaHVtYjo6
U2l6ZQA1Mzg4QkLGvIjcAAAARnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vYXBwL3RtcC9pbWFnZWxj
L2ltZ3ZpZXcyXzlfMTU5ODg2Mjg3Nzk0NjU4OTVfMjlfWzBdEGwPLgAAAABJRU5ErkJggg==" ></image>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

11
docs/index.md Normal file
View File

@ -0,0 +1,11 @@
# FreeSql Document
#### [http://freesql.net](http://freesql.net)
.NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, MsAccess orm.
- Github [https://github.com/dotnetcore/freesql](https://github.com/dotnetcore/freesql)
- Gitee [https://gitee.com/FreeSql/FreeSql-ORM](https://gitee.com/FreeSql/FreeSql-ORM)

11
docs/toc.yml Normal file
View File

@ -0,0 +1,11 @@
- name: FreeSql Documentation
href: api/
homepage: api/index.md
- name: Repository Documentation
href: freesql/repository/
homepage: freesql/repository/index.md
- name: Provider Documentation
href: freesql/provider/
homepage: freesql/provider/index.md