mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 04:18:16 +08:00
pgsql/mysql/sqlserver适配
This commit is contained in:
92
Docs/Generator.md
Normal file
92
Docs/Generator.md
Normal file
@ -0,0 +1,92 @@
|
||||
# 生成器
|
||||
|
||||
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
|
||||
|
||||
| 模板名称 | 路径 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
|
||||
| ------------- | - | - |- | - |- | - |- |
|
||||
| simple-entity | ../Templates/MySql/simple-entity | √ | X | X | √ | X | X |
|
||||
| simple-entity-navigation-object | ../Templates/MySql/simple-entity-navigation-object | √ | √ | X | √ | X | X |
|
||||
| rich-entity-navigation-object | ../Templates/MySql/rich-entity-navigation-object | √ | √ | √ | X | √ | X |
|
||||
|
||||
> 更多模板逐步开发中。。。
|
||||
|
||||
```csharp
|
||||
//定义 mysql FreeSql
|
||||
var mysql = new FreeSql.FreeSqlBuilder()
|
||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
||||
.Build();
|
||||
|
||||
//创建模板生成类现实
|
||||
var gen = new FreeSql.Generator.TemplateGenerator();
|
||||
gen.Build(mysql.DbFirst,
|
||||
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
|
||||
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
|
||||
"cccddd" //数据库
|
||||
);
|
||||
```
|
||||
|
||||
## 模板语法
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>{#title}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!--绑定表达式-->
|
||||
{#表达式}
|
||||
{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高
|
||||
|
||||
<!--可嵌套使用,同一标签最多支持3个指令-->
|
||||
{include ../header.html}
|
||||
<div @for="i 1, 101">
|
||||
<p @if="i === 50" @for="item,index in data">aaa</p>
|
||||
<p @else="i % 3 === 0">bbb {#i}</p>
|
||||
<p @else="">ccc {#i}</p>
|
||||
</div>
|
||||
|
||||
<!--定义模块,可以将公共模块定义到一个文件中-->
|
||||
{module module_name1 parms1, 2, 3...}
|
||||
{/module}
|
||||
{module module_name2 parms1, 2, 3...}
|
||||
{/module}
|
||||
|
||||
<!--使用模块-->
|
||||
{import ../module.html as myname}
|
||||
{#myname.module_name(parms1, 2, 3...)}
|
||||
|
||||
<!--继承-->
|
||||
{extends ../inc/layout.html}
|
||||
{block body}{/block}
|
||||
|
||||
<!--嵌入代码块-->
|
||||
{%
|
||||
for (var a = 0; a < 100; a++)
|
||||
print(a);
|
||||
%}
|
||||
|
||||
<!--条件分支-->
|
||||
{if i === 50}
|
||||
{elseif i > 60}
|
||||
{else}
|
||||
{/if}
|
||||
|
||||
<!--三种循环-->
|
||||
{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2}
|
||||
|
||||
{for item,index in items} 可选参数称 index
|
||||
可自定义名 {for item2, index99 in 数组表达式}
|
||||
|
||||
{for key,item,index on json} 可选参数 item, index,
|
||||
可自定义名 {for key2, item2, index99 in 对象表达式}
|
||||
{/for}
|
||||
|
||||
<!--不被解析-->
|
||||
{miss}
|
||||
此块内容不被bmw.js解析
|
||||
{/miss}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
135
Docs/codefirst.md
Normal file
135
Docs/codefirst.md
Normal file
@ -0,0 +1,135 @@
|
||||
# CodeFirst
|
||||
|
||||
### 支持的类型
|
||||
|
||||
bool, byte, short, int, long, byte, ushort, uint, ulong, double, float, decimal, int
|
||||
|
||||
bool?, byte?, short?, int?, long?, byte?, ushort?, uint?, ulong?, double?, float?, decimal?, int?
|
||||
|
||||
TimeSpan, DateTime
|
||||
|
||||
TimeSpan?, DateTime?
|
||||
|
||||
byte[], string
|
||||
|
||||
MygisPoint, MygisLineString, MygisPolygon, MygisMultiPoint, MygisMultiLineString, MygisMultiPolygon
|
||||
|
||||
```csharp
|
||||
var mysql = new MySql(null, null, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=3", null, null);
|
||||
```
|
||||
|
||||
### 自动同步实体结构【开发环境必备】
|
||||
|
||||
自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
|
||||
|
||||
```csharp
|
||||
mysql.CodeFirst.IsAutoSyncDataStructure = true;
|
||||
```
|
||||
|
||||
> 此功能默认为开启状态,发布正式环境后,请修改此设置
|
||||
|
||||
> 虽然【自动同步实体结构】功能开发非常好用,但是有个坏处,就是数据库后面会很乱,没用的字段一大堆
|
||||
|
||||
### 手工同步实体结构
|
||||
|
||||
| 实体&表对比 | 添加 | 改名 | 删除 |
|
||||
| - | - | - | - |
|
||||
| | √ | √ | X |
|
||||
|
||||
| 实体属性&字段对比 | 添加 | 修改可空 | 修改自增 | 修改类型 | 改名 | 删除 |
|
||||
| - | - | - | - | - | - | - |
|
||||
| | √ | √ | √ | √ | √ | X |
|
||||
|
||||
> 为了保证安全,不提供删除字段
|
||||
|
||||
|
||||
1、提供方法对比实体,与数据库中的变化部分
|
||||
|
||||
```csharp
|
||||
var t1 = mysql.CodeFirst.GetComparisonDDLStatements<Topic>();
|
||||
|
||||
class Topic {
|
||||
[Column(IsIdentity = true, IsPrimary = true)]
|
||||
public int Id { get; set; }
|
||||
public int Clicks { get; set; }
|
||||
public TestTypeInfo Type { get; set; }
|
||||
public string Title { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
public ushort fusho { get; set; }
|
||||
}
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS `cccddd`.`Topic` (
|
||||
`Id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`Clicks` INT(11) NOT NULL,
|
||||
`Title` VARCHAR(255),
|
||||
`CreateTime` DATETIME NOT NULL,
|
||||
`fusho` SMALLINT(5) UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (`Id`)
|
||||
) Engine=InnoDB CHARACTER SET utf8;
|
||||
```
|
||||
|
||||
2、指定实体的表名
|
||||
|
||||
指定 Name 后,实体类名变化不影响数据库对应的表
|
||||
```csharp
|
||||
[Table(Name = "tb_topic111")]
|
||||
class Topic {
|
||||
//...
|
||||
}
|
||||
```
|
||||
|
||||
3、无指定实体的表名,修改实体类名
|
||||
|
||||
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
|
||||
|
||||
```csharp
|
||||
[Table(OldName = "Topic")]
|
||||
class Topic2 {
|
||||
//...
|
||||
}
|
||||
```
|
||||
```sql
|
||||
ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`;
|
||||
```
|
||||
|
||||
4、修改属性的类型
|
||||
|
||||
把 Id 类型改为 uint 后
|
||||
```sql
|
||||
ALTER TABLE `cccddd`.`Topic2` MODIFY `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||
```
|
||||
```csharp
|
||||
[Column(DbType = "varchar(128)")]
|
||||
public string Title { get; set; }
|
||||
```
|
||||
```sql
|
||||
ALTER TABLE `cccddd`.`Topic2` MODIFY `Title2` VARCHAR(128);
|
||||
```
|
||||
|
||||
5、指定属性的字段名
|
||||
|
||||
这样指定后,修改实体的属性名不影响数据库对应的列
|
||||
```csharp
|
||||
[Column(Name = "titl2")]
|
||||
public string Title { get; set; }
|
||||
```
|
||||
|
||||
6、无指定属性的字段名,修改属性名
|
||||
|
||||
指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】
|
||||
|
||||
```csharp
|
||||
[Column(OldName = "Title2")]
|
||||
public string Title { get; set; }
|
||||
```
|
||||
```sql
|
||||
ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);
|
||||
```
|
||||
|
||||
7、提供方法同步结构
|
||||
|
||||
```csharp
|
||||
var t2 = mysql.CodeFirst.SyncStructure<Topic>();
|
||||
//同步实体类型到数据库
|
||||
```
|
112
Docs/dbfirst.md
Normal file
112
Docs/dbfirst.md
Normal file
@ -0,0 +1,112 @@
|
||||
# DbFirst
|
||||
|
||||
```csharp
|
||||
MySql mysql = new MySql(null, null, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=3", null, null);
|
||||
```
|
||||
|
||||
### 获取所有数据库
|
||||
|
||||
```csharp
|
||||
var t1 = mysql.DbFirst.GetDatabases();
|
||||
//返回字符串数组, ["cccddd", "test"]
|
||||
```
|
||||
|
||||
### 获取指定数据库的表信息
|
||||
|
||||
```csharp
|
||||
var t2 = mysql.DbFirst.GetTablesByDatabase(mysql.DbFirst.GetDatabases()[0]);
|
||||
//返回包括表、列详情、主键、唯一键、索引、外键
|
||||
```
|
||||
|
||||
# 生成器
|
||||
|
||||
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
|
||||
|
||||
| 模板名称 | 路径 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
|
||||
| ------------- | - | - |- | - |- | - |- |
|
||||
| simple-entity | ../Templates/MySql/simple-entity | √ | X | X | √ | X | X |
|
||||
| simple-entity-navigation-object | ../Templates/MySql/simple-entity-navigation-object | √ | √ | X | √ | X | X |
|
||||
| rich-entity-navigation-object | ../Templates/MySql/rich-entity-navigation-object | √ | √ | √ | X | √ | X |
|
||||
|
||||
> 更多模板逐步开发中。。。
|
||||
|
||||
```csharp
|
||||
//定义 mysql FreeSql
|
||||
var mysql = new FreeSql.FreeSqlBuilder()
|
||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
||||
.Build();
|
||||
|
||||
//创建模板生成类现实
|
||||
var gen = new FreeSql.Generator.TemplateGenerator();
|
||||
gen.Build(mysql.DbFirst,
|
||||
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
|
||||
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
|
||||
"cccddd" //数据库
|
||||
);
|
||||
```
|
||||
|
||||
## 模板语法
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>{#title}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!--绑定表达式-->
|
||||
{#表达式}
|
||||
{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高
|
||||
|
||||
<!--可嵌套使用,同一标签最多支持3个指令-->
|
||||
{include ../header.html}
|
||||
<div @for="i 1, 101">
|
||||
<p @if="i === 50" @for="item,index in data">aaa</p>
|
||||
<p @else="i % 3 === 0">bbb {#i}</p>
|
||||
<p @else="">ccc {#i}</p>
|
||||
</div>
|
||||
|
||||
<!--定义模块,可以将公共模块定义到一个文件中-->
|
||||
{module module_name1 parms1, 2, 3...}
|
||||
{/module}
|
||||
{module module_name2 parms1, 2, 3...}
|
||||
{/module}
|
||||
|
||||
<!--使用模块-->
|
||||
{import ../module.html as myname}
|
||||
{#myname.module_name(parms1, 2, 3...)}
|
||||
|
||||
<!--继承-->
|
||||
{extends ../inc/layout.html}
|
||||
{block body}{/block}
|
||||
|
||||
<!--嵌入代码块-->
|
||||
{%
|
||||
for (var a = 0; a < 100; a++)
|
||||
print(a);
|
||||
%}
|
||||
|
||||
<!--条件分支-->
|
||||
{if i === 50}
|
||||
{elseif i > 60}
|
||||
{else}
|
||||
{/if}
|
||||
|
||||
<!--三种循环-->
|
||||
{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2}
|
||||
|
||||
{for item,index in items} 可选参数称 index
|
||||
可自定义名 {for item2, index99 in 数组表达式}
|
||||
|
||||
{for key,item,index on json} 可选参数 item, index,
|
||||
可自定义名 {for key2, item2, index99 in 对象表达式}
|
||||
{/for}
|
||||
|
||||
<!--不被解析-->
|
||||
{miss}
|
||||
此块内容不被bmw.js解析
|
||||
{/miss}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
80
Docs/delete.md
Normal file
80
Docs/delete.md
Normal file
@ -0,0 +1,80 @@
|
||||
# 删除数据
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| - | - | - | - |
|
||||
| Where | \<this\> | Lambda | 表达式条件,仅支持实体基础成员(不包含导航对象) |
|
||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
||||
| Where | \<this\> | T1 \| IEnumerable<T1> | 传入实体或集合,将其主键作为条件 |
|
||||
| WhereExists | \<this\> | ISelect | 子查询是否存在 |
|
||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteDeleted | List\<T1\> | | 执行SQL语句,返回被删除的记录 |
|
||||
|
||||
### 测试代码
|
||||
|
||||
```csharp
|
||||
var mysql = new MySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=3");
|
||||
IDelete<Topic> delete => mysql.Delete<Topic>();
|
||||
|
||||
[Table(Name = "tb_topic")]
|
||||
class Topic {
|
||||
[Column(IsIdentity = true, IsPrimary = true)]
|
||||
public int Id { get; set; }
|
||||
public int Clicks { get; set; }
|
||||
public TestTypeInfo Type { get; set; }
|
||||
public string Title { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
### 动态条件
|
||||
```csharp
|
||||
Delete<Topic>(object dywhere)
|
||||
```
|
||||
dywhere 支持
|
||||
|
||||
* 主键值
|
||||
* new[] { 主键值1, 主键值2 }
|
||||
* Topic对象
|
||||
* new[] { Topic对象1, Topic对象2 }
|
||||
* new { id = 1 }
|
||||
|
||||
```csharp
|
||||
var t1 = mysql.Delete<Topic>(new[] { 1, 2 }).ToSql();
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
|
||||
|
||||
var t2 = mysql.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
||||
|
||||
var t3 = mysql.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
|
||||
|
||||
var t4 = mysql.Delete<Topic>(new { id = 1 }).ToSql();
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
||||
```
|
||||
|
||||
### 删除条件
|
||||
|
||||
```csharp
|
||||
var t5 = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
||||
|
||||
var t6 = delete.Where("id = ?id", new { id = 1 }).ToSql().Replace("\r\n", "");
|
||||
//DELETE FROM `tb_topic` WHERE (id = ?id)
|
||||
|
||||
var item = new Topic { Id = 1, Title = "newtitle" };
|
||||
var t7 = delete.Where(item).ToSql().Replace("\r\n", "");
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
||||
|
||||
var items = new List<Topic>();
|
||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
||||
var t8 = delete.Where(items).ToSql().Replace("\r\n", "");
|
||||
//DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
||||
```
|
||||
|
||||
### 执行命令
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| - | - | - | - |
|
||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteDeleted | List\<T1\> | | 执行SQL语句,返回被删除的记录 |
|
77
Docs/insert.md
Normal file
77
Docs/insert.md
Normal file
@ -0,0 +1,77 @@
|
||||
# 插入数据
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| - | - | - | - |
|
||||
| AppendData | \<this\> | T1 \| IEnumerable<T1> | 追加准备插入的实体 |
|
||||
| InsertColumns | \<this\> | Lambda | 只插入的列 |
|
||||
| IgnoreColumns | \<this\> | Lambda | 忽略的列 |
|
||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteIdentity | long | | 执行SQL语句,返回自增值 |
|
||||
| ExecuteInserted | List\<T1\> | | 执行SQL语句,返回插入后的记录 |
|
||||
|
||||
### 列优先级
|
||||
|
||||
> 全部列 < 指定列(InsertColumns) < 忽略列(IgnoreColumns)
|
||||
|
||||
### 测试代码
|
||||
|
||||
```csharp
|
||||
var mysql = new MySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=3");
|
||||
IInsert<Topic> insert => mysql.Insert<Topic>();
|
||||
|
||||
[Table(Name = "tb_topic")]
|
||||
class Topic {
|
||||
[Column(IsIdentity = true, IsPrimary = true)]
|
||||
public int Id { get; set; }
|
||||
public int Clicks { get; set; }
|
||||
public TestTypeInfo Type { get; set; }
|
||||
public string Title { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
}
|
||||
|
||||
var items = new List<Topic>();
|
||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
||||
```
|
||||
|
||||
### 插入
|
||||
|
||||
```csharp
|
||||
var t1 = insert.AppendData(items.First()).ToSql();
|
||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) VALUES(?Clicks0, ?Title0, ?CreateTime0)
|
||||
```
|
||||
|
||||
### 批量插入
|
||||
|
||||
```csharp
|
||||
var t2 = insert.AppendData(items).ToSql();
|
||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) VALUES(?Clicks0, ?Title0, ?CreateTime0), (?Clicks1, ?Title1, ?CreateTime1), (?Clicks2, ?Title2, ?CreateTime2), (?Clicks3, ?Title3, ?CreateTime3), (?Clicks4, ?Title4, ?CreateTime4), (?Clicks5, ?Title5, ?CreateTime5), (?Clicks6, ?Title6, ?CreateTime6), (?Clicks7, ?Title7, ?CreateTime7), (?Clicks8, ?Title8, ?CreateTime8), (?Clicks9, ?Title9, ?CreateTime9)
|
||||
```
|
||||
|
||||
### 只想插入指定的列
|
||||
|
||||
```csharp
|
||||
var t3 = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
|
||||
//INSERT INTO `tb_topic`(`Title`) VALUES(?Title0), (?Title1), (?Title2), (?Title3), (?Title4), (?Title5), (?Title6), (?Title7), (?Title8), (?Title9)
|
||||
|
||||
var t4 = insert.AppendData(items).InsertColumns(a =>new { a.Title, a.Clicks }).ToSql();
|
||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(?Clicks0, ?Title0), (?Clicks1, ?Title1), (?Clicks2, ?Title2), (?Clicks3, ?Title3), (?Clicks4, ?Title4), (?Clicks5, ?Title5), (?Clicks6, ?Title6), (?Clicks7, ?Title7), (?Clicks8, ?Title8), (?Clicks9, ?Title9)
|
||||
```
|
||||
|
||||
### 忽略列
|
||||
|
||||
```csharp
|
||||
var t5 = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
|
||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(?Clicks0, ?Title0), (?Clicks1, ?Title1), (?Clicks2, ?Title2), (?Clicks3, ?Title3), (?Clicks4, ?Title4), (?Clicks5, ?Title5), (?Clicks6, ?Title6), (?Clicks7, ?Title7), (?Clicks8, ?Title8), (?Clicks9, ?Title9)
|
||||
|
||||
var t6 = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).ToSql();
|
||||
///INSERT INTO `tb_topic`(`Clicks`) VALUES(?Clicks0), (?Clicks1), (?Clicks2), (?Clicks3), (?Clicks4), (?Clicks5), (?Clicks6), (?Clicks7), (?Clicks8), (?Clicks9)
|
||||
```
|
||||
|
||||
### 执行命令
|
||||
|
||||
| 方法 | 返回值 | 描述 |
|
||||
| - | - | - |
|
||||
| ExecuteAffrows | long | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteIdentity | long | 执行SQL语句,返回自增值 |
|
||||
| ExecuteInserted | List\<T1\> | 执行SQL语句,返回插入后的记录 |
|
48
Docs/select.md
Normal file
48
Docs/select.md
Normal file
@ -0,0 +1,48 @@
|
||||
# 查询数据
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| ------------- | - | - | - |
|
||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
||||
| ToList | List<T1> | | 执行SQL查询,返回 T1 实体所有字段的记录,若存在导航属性则一起查询返回,记录不存在时返回 Count 为 0 的列表 |
|
||||
| ToList\<T\> | List\<T\> | Lambda | 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 |
|
||||
| ToList\<T\> | List\<T\> | string field | 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表 |
|
||||
| ToOne | T1 | | 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null |
|
||||
| Any | bool | | 执行SQL查询,是否有记录 |
|
||||
| Sum | T | Lambda | 指定一个列求和 |
|
||||
| Min | T | Lambda | 指定一个列求最小值 |
|
||||
| Max | T | Lambda | 指定一个列求最大值 |
|
||||
| Avg | T | Lambda | 指定一个列求平均值 |
|
||||
| 【分页】 |
|
||||
| Count | long | | 查询的记录数量 |
|
||||
| Count | \<this\> | out long | 查询的记录数量,以参数out形式返回 |
|
||||
| Skip | \<this\> | int offset | 查询向后偏移行数 |
|
||||
| Offset | \<this\> | int offset | 查询向后偏移行数 |
|
||||
| Limit | \<this\> | int limit | 查询多少条数据 |
|
||||
| Take | \<this\> | int limit | 查询多少条数据 |
|
||||
| Page | \<this\> | int pageIndex, int pageSize | 分页 |
|
||||
| 【条件】 |
|
||||
| Where | \<this\> | Lambda | 支持多表查询表达式 |
|
||||
| WhereIf | \<this\> | bool, Lambda | 支持多表查询表达式 |
|
||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
||||
| WhereIf | \<this\> | bool, string, parms | 原生sql语法条件,WhereIf(true, "id = ?id", new { id = 1 }) |
|
||||
| WhereLike | \<this\> | Lambda, string, bool | like 查询条件,where title like '%xxx%' or content like '%xxx%' |
|
||||
| 【分组】 |
|
||||
| GroupBy | \<this\> | Lambda | 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | GroupBy(a => new[]{"name","time"}) |
|
||||
| GroupBy | \<this\> | string, parms | 按原生sql语法分组,GroupBy("concat(name, ?cc)", new { cc = 1 }) |
|
||||
| Having | \<this\> | string, parms | 按原生sql语法聚合条件过滤,Having("count(name) = ?cc", new { cc = 1 }) |
|
||||
| 【排序】 |
|
||||
| OrderBy | \<this\> | Lambda | 按列排序,OrderBy(a => a.Time) |
|
||||
| OrderByDescending | \<this\> | Lambda | 按列倒向排序,OrderByDescending(a => a.Time) |
|
||||
| OrderBy | \<this\> | string, parms | 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 }) |
|
||||
| 【联表】 |
|
||||
| LeftJoin | \<this\> | Lambda | 左联查询,可使用导航属性,或指定关联的实体类型 |
|
||||
| InnerJoin | \<this\> | Lambda | 联接查询,可使用导航属性,或指定关联的实体类型 |
|
||||
| RightJoin | \<this\> | Lambda | 右联查询,可使用导航属性,或指定关联的实体类型 |
|
||||
| LeftJoin | \<this\> | string, parms | 左联查询,使用原生sql语法,LeftJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
||||
| InnerJoin | \<this\> | string, parms | 联接查询,使用原生sql语法,InnerJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
||||
| RightJoin | \<this\> | string, parms | 右联查询,使用原生sql语法,RightJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
||||
| From | \<this\> | Lambda | 多表查询,3个表以上使用非常方便,目前设计最大支持10个表 |
|
||||
| 【其他】 |
|
||||
| As | \<this\> | string alias = "a" | 指定别名 |
|
||||
| Master | \<this\> | | 指定从主库查询(默认查询从库) |
|
||||
| Caching | \<this\> | int seconds, string key = null | 缓存查询结果 |
|
127
Docs/update.md
Normal file
127
Docs/update.md
Normal file
@ -0,0 +1,127 @@
|
||||
# 更新数据
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| - | - | - | - |
|
||||
| SetSource | \<this\> | T1 \| IEnumerable<T1> | 更新数据,设置更新的实体 |
|
||||
| IgnoreColumns | \<this\> | Lambda | 忽略的列 |
|
||||
| Set | \<this\> | Lambda, value | 设置列的新值,Set(a => a.Name, "newvalue") |
|
||||
| Set | \<this\> | Lambda | 设置列的的新值为基础上增加,Set(a => a.Clicks + 1),相当于 clicks=clicks+1; |
|
||||
| SetRaw | \<this\> | string, parms | 设置值,自定义SQL语法,SetRaw("title = ?title", new { title = "newtitle" }) |
|
||||
| Where | \<this\> | Lambda | 表达式条件,仅支持实体基础成员(不包含导航对象) |
|
||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
||||
| Where | \<this\> | T1 \| IEnumerable<T1> | 传入实体或集合,将其主键作为条件 |
|
||||
| WhereExists | \<this\> | ISelect | 子查询是否存在 |
|
||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteUpdated | List\<T1\> | | 执行SQL语句,返回更新后的记录 |
|
||||
|
||||
### 列优先级
|
||||
|
||||
> 全部列 < 指定列(Set/SetRaw) < 忽略列(IgnoreColumns)
|
||||
|
||||
### 测试代码
|
||||
|
||||
```csharp
|
||||
[Table(Name = "tb_topic")]
|
||||
class Topic {
|
||||
[Column(IsIdentity = true, IsPrimary = true)]
|
||||
public int Id { get; set; }
|
||||
public int Clicks { get; set; }
|
||||
public TestTypeInfo Type { get; set; }
|
||||
public string Title { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
}
|
||||
|
||||
var mysql = new MySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=3");
|
||||
IUpdate<Topic> update => mysql.Update<Topic>();
|
||||
```
|
||||
|
||||
### 动态条件
|
||||
```csharp
|
||||
Update<Topic>(object dywhere)
|
||||
```
|
||||
dywhere 支持
|
||||
|
||||
* 主键值
|
||||
* new[] { 主键值1, 主键值2 }
|
||||
* Topic对象
|
||||
* new[] { Topic对象1, Topic对象2 }
|
||||
* new { id = 1 }
|
||||
|
||||
### 更新指定列
|
||||
```csharp
|
||||
var t1 = mysql.Update<Topic>(1).Set(a => a.CreateTime, DateTime.Now).ToSql();
|
||||
//UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59' WHERE (`Id` = 1)
|
||||
```
|
||||
|
||||
### 更新指定列,累加
|
||||
```csharp
|
||||
var t2 = mysql.Update<Topic>(1).Set(a => a.Clicks + 1).ToSql();
|
||||
//UPDATE `tb_topic` SET `Clicks` = ifnull(`Clicks`,0) + 1 WHERE (`Id` = 1)
|
||||
```
|
||||
|
||||
### 保存实体
|
||||
```csharp
|
||||
var item = new Topic { Id = 1, Title = "newtitle" };
|
||||
var t3 = update.SetSource(item).ToSql();
|
||||
//UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2 WHERE (`Id` = 1)
|
||||
```
|
||||
|
||||
### 保存实体,忽略一些列
|
||||
```csharp
|
||||
var t4 = update.SetSource(item).IgnoreColumns(a => a.Clicks).ToSql();
|
||||
//UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 WHERE (`Id` = 1)
|
||||
var t5 = update.SetSource(item).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql();
|
||||
//UPDATE `tb_topic` SET `Title` = ?p_0 WHERE (`Id` = 1)
|
||||
```
|
||||
|
||||
### 批量保存
|
||||
```csharp
|
||||
var items = new List<Topic>();
|
||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
||||
|
||||
var t6 = update.SetSource(items).ToSql();
|
||||
//UPDATE `tb_topic` SET `Clicks` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END, `Title` = CASE `Id` WHEN 1 THEN ?p_10 WHEN 2 THEN ?p_11 WHEN 3 THEN ?p_12 WHEN 4 THEN ?p_13 WHEN 5 THEN ?p_14 WHEN 6 THEN ?p_15 WHEN 7 THEN ?p_16 WHEN 8 THEN ?p_17 WHEN 9 THEN ?p_18 WHEN 10 THEN ?p_19 END, `CreateTime` = CASE `Id` WHEN 1 THEN ?p_20 WHEN 2 THEN ?p_21 WHEN 3 THEN ?p_22 WHEN 4 THEN ?p_23 WHEN 5 THEN ?p_24 WHEN 6 THEN ?p_25 WHEN 7 THEN ?p_26 WHEN 8 THEN ?p_27 WHEN 9 THEN ?p_28 WHEN 10 THEN ?p_29 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
||||
```
|
||||
|
||||
> 批量保存的场景,先查询20条记录,根据本地很复杂的规则把集合的值改完后
|
||||
|
||||
> 传统做法是循环20次保存,用 case when 只要一次就行
|
||||
|
||||
### 批量保存,忽略一些列
|
||||
```csharp
|
||||
var t7 = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql();
|
||||
//UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
||||
```
|
||||
|
||||
### 批量更新指定列
|
||||
```csharp
|
||||
var t8 = update.SetSource(items).Set(a => a.CreateTime, DateTime.Now).ToSql();
|
||||
//UPDATE `tb_topic` SET `CreateTime` = ?p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
||||
```
|
||||
|
||||
> 指定列更新后,批量保存将失效
|
||||
|
||||
### 更新条件
|
||||
|
||||
> 除了顶上介绍的 dywhere 构造参数外,还支持 Where lambda/sql 方法
|
||||
|
||||
```csharp
|
||||
var t9 = update.Set(a => a.Title, "新标题").Where(a => a.Id == 1).ToSql();
|
||||
//UPDATE `tb_topic` SET `Title` = '新标题' WHERE (Id = 1)
|
||||
```
|
||||
|
||||
### 自定义SQL
|
||||
|
||||
```csharp
|
||||
var t10 = update.SetRaw("Title = {0}", "新标题").Where("Id = {0}", 1).ToSql();
|
||||
//UPDATE `tb_topic` SET Title = '新标题' WHERE (Id = 1)
|
||||
//sql语法条件,参数使用 {0},与 string.Format 保持一致,无须加单引号,错误的用法:'{0}'
|
||||
```
|
||||
|
||||
### 执行命令
|
||||
|
||||
| 方法 | 返回值 | 参数 | 描述 |
|
||||
| - | - | - | - |
|
||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
||||
| ExecuteUpdated | List\<T1\> | | 执行SQL语句,返回更新后的记录 |
|
Reference in New Issue
Block a user