[TOC]
## 更新
2022-06-24 新增Contains 自定义通配符位置,只要查询内容存在%则不在两边增加
## 高级查询
### Like
```
// like %梵天%
db.Table<Model.Company>.Where(m => m.Name.Contains("梵天")).FindAll();
//2022-06-24 like 梵天%公司
db.Table<Model.Company>.Where(m => m.Name.Contains("梵天%公司")).FindAll();
// like 梵天%
db.Table<Model.Company>.Where(m => m.Name.StartsWith("梵天")).FindAll();
// like %梵天
db.Table<Model.Company>.Where(m => m.Name.EndsWith("梵天")).FindAll();
```
### Equals
```
db.Table<Model.Company>.Where(m => m.Name.Equals("梵天")).FindAll();
```
### MD5函数
```
db.Table<Model.Company>.Where(m => m.Name.MD5Equals("7ca3245c3d13f4aec721127736628ea7")).FindAll();
```
### Where In
```
db.Table<Model.Company>.Where(m => m.Name.InList(new[] {"百度", "腾讯"})).FindAll();
```
### ~~Where对象~~ [弃用]
```
var queryObj = new queryModel();
queryObj.Name = "搜索的名词";
queryObj.LikeStartWith = "模糊搜索%";
queryObj.LikeEndWtih = "%模糊搜索";
queryObj.LikeBoth = "%模糊搜索%";
queryObj.WhereIn = new object[] {1, 2, 3};
db.Table<Model.Company>.Where(queryObj).FindAll();
```
提供了一个特性 `ORMModify`
```
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class ORMWhereObject : Attribute
{
/// <summary>
/// 不参与条件筛选
/// </summary>
public bool Ignore { get; set; }
}
```
### ORMModify<T>
下面是一个获取列表的例子
```csharp
public IActionResult GetList(string articleId)
{
//如果要查询的articleId是null的条件,则需要给初始对象ArticleId一个非null的值
var message = new Model.Message { ArticleId = articleId == null ? "" : null };
// 创建modifyObject 时 message 会被记录
ORMModify<Model.Message> modifyObject = new ORMModify<Model.Message>(message);
// 修改ArticleId
message.ArticleId = articleId;
// Where 会自动识别被修改的ArticleId,模型中其他的未修改的值不会参与到查询条件中去
var list = Utility.db.Table<Model.Message>().Where(modifyObject).Page(10,1).FindAll();
// 输出SQL是
// SELECT * FROM V1_Message WHERE ArticleId IS NULL LIMIT 0,10
return new ActionResult { Code = "0000", Data = list };
}
```
### WhereOr
如果出现多个OR条件需要追加的情况下面函数可以使用
```
db.Table<Model.Company>
.WhereOr(m => m.Name == "梵天" || m.Name == "阿里", "SEARCH_GROUP_NAME")
.WhereOr(m => m.Name == "梵天" || m.Name == "阿里", "SEARCH_GROUP_NAME")
.FindAll();
```
`SEARCH_GROUP_NAME` 的作用是为当前的条件标组,相同组名的条件会并成一个OR组合,最终AND到所有条件中去
### 自定义查询条件
因为 Where 接收的时表达式 `Expression<Func<T, bool>>` 但是有时候我们不能确定表达式中的属性名时,可以使用 `FieldName`
```
string[] fields = new string[] { "CompanyName", "LoginName" };
var itemDB= db.Table<Model.Company>();
foreach(var field in fields)
{
itemDB.Where(m => m.FieldName(field).Equals("梵天"));
}
itemDB.FindAll();
```
### 联表查询
假设有一张关联表 Model.CompanyExtend 记录了单位的一些拓展信息
```
db.Table<Model.Company>()
.Join<Model.CompanyExtend>((c, ext) => c.Id == ext.CompanyId)
.FindAll<Model.CompanyExtend>((c, ext) => new object[] { c.Id, c.ComanyName, ext.Other });
```
#### 表重名的处理
**2022/03/01 更新**
- 已经删除`FindOne\FindAll`传参的方法,新增`SetFindField`方法接收
- 修改`AsFieldName`方法为`AsName `
```
db.Table<Model.Company>()
.Join<Model.CompanyExtend>((c, ext) => c.Id == ext.CompanyId)
.SetFindField<Model.CompanyExtend>((c, ext) => new object[] { c.Id, c.ComanyName.AsName("LoginName"), ext.Other })
.FindAll();
```
**需要注意的是,模型得有接收AsFieldName的对应属性**
~~FindOne \ FindAll 支持传入object[] 来约束返回的字段~~