[TOC]
## 更新时间
2022/2/8
## 用途
减轻后端对列表查询的编写逻辑,所以特定一套前端查询语法
## 使用限制
查询语法是基于对象的查询语法,所以要查询的属性必须是对象包含的属性
## 语法
### 属性名
要查询的属性名称,必须是对象包含的属性
### 约束
约束必须是字符串格式,格式如下
`组名称[操作符,值,逻辑符]`
#### 组名称
在逻辑符为 `或` 时有效
#### 操作符
目前支持 `=`,`!=`,`>`,`>=`,`<`,`<=`,`LIKE`,`!LIKE`,`%`,`!%`,`IN`,`!IN`,`IS`
2022.02.22 新增 `DESC`,`ASC` 排序
2022.03.31 新增 `E>`,`E<` 等价于 `>=`,`<=`
- %符号是LIKE的缩写
- 操作符大小写不敏感
#### 逻辑符
`AND` / `OR`
### SetCondition
2022.02.22 新增 可以过程中设置查询条件,编译安全推荐使用
注意,条件必须使用 Equals 函数进行指定
```
search.SetCondition(m => m.LoginName.Equals("[=,梵天]"));
```
### GetCondition
2022.04.22 新增 过程中可以获取已经设置的条件
```
string con = search.GetCondition(m => m.CompanyName);
```
### 例子
一个搜索接口定义如下:
```csharp
public IActionResult PostSearch(Dictionary<string, string> searchKey)
{
var search = new ORMSearch<Model.Company>(searchKey);
search.SetCondition(m => m.LoginName.Equals("[=,梵天]"));
var itemDB = Utility.db.Table<Model.Company>();
search.SetWhereCondition(itemDB);
itemDB.ThrowSQLString().FindAll();
return new DefaultActionResult { Code = "0000" };
}
```
正常情况下我们的查询交互:
```json
{
"searchKey": {
"companyName": "测试",
"loginCount": "0",
"createTime": "2022-2-1"
}
}
```
输出SQL语句如下:
```sql
SELECT * FROM V2_Company WHERE
V2_Company.LoginName = '梵天' AND // 由 SetCondition 产生
V2_Company.CompanyName = '测试' AND
V2_Company.LoginCount = 0 AND
V2_Company.CreateTime = '2022-02-01 00:00:00.000000'
```
使用查询语法后POST数据格式如下:
```json
{
"searchKey": {
"companyName": "[like,%测试%]",
"city": "[in,WZ|TZ|HZ]",
"loginCount": "[=,0]",
"createTime": "[>, 2022-2-7][desc]"
}
}
```
输出的SQL语句如下:
```
SELECT * FROM V2_Company
WHERE V2_Company.CompanyName LIKE '%测试%' AND
V2_Company.City IN ('WZ','TZ','HZ') AND
V2_Company.LoginCount = 0 AND
V2_Company.CreateTime > '2022-02-07 00:00:00.000000'
ORDER BY V2_Company.CreateTime DESC
```
### NULL查询
修改POST的参数
```json
{
"searchKey": {
"companyName": "[is,null]",
"loginCount": "[is, not null]"
}
}
```
输出的SQL语句如下:
```sql
SELECT * FROM V2_Company WHERE
V2_Company.CompanyName IS NULL AND
V2_Company.LoginName IS NOT NULL
```
### 或逻辑
修改POST的参数
```json
{
"searchKey": {
"companyName": "G1[like,%测试%,OR][LIKE,%游戏%,OR]G2[LIKE,%老大%]",
"loginCount": "[=,0]",
"createTime": "G2[>,2022-2-1,OR]"
}
}
```
输出的SQL语句如下:
```sql
SELECT * FROM V2_Company
WHERE V2_Company.LoginCount = 0 AND
(V2_Company.CompanyName LIKE '%测试%' OR V2_Company.CompanyName LIKE '%游戏%') AND
(V2_Company.CompanyName LIKE '%老大%' OR V2_Company.CreateTime > '2022-02-01 00:00:00.000000')
```