ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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[] 来约束返回的字段~~