查询数据
- 本节介绍XCode查询数据的各种方法
var id = 1;// 根据主键查找var student = Student.FindByKey(id);Console.WriteLine("FindByKey:{0}", student.Name);Console.WriteLine();// 带条件查找student = Student.Find(Student._.ID == id & Student._.Sex == SexKinds.男);Console.WriteLine("Find:{0}", student.Name);Console.WriteLine();// 单对象缓存查找student = Student.Meta.SingleCache[id];Console.WriteLine("SingleCache:{0}", student.Name);Console.WriteLine();// 带分页查找var page = new PageParameter();page.Desc = true;page.Sort = Student._.ID;page.PageIndex = 1;page.PageSize = 5;student = Student.FindAll(Student._.ID == id, page).FirstOrDefault();Console.WriteLine("FindAll:{0}", student?.Name);Console.WriteLine();// 手写SQL查找student = Student.FindAll("Select * From Student").FirstOrDefault();Console.WriteLine("FindAll SQL:{0}", student?.Name);Console.WriteLine();// 实体缓存查找student = Student.Meta.Cache.Entities.FindAll(f=>f.ID == id).FirstOrDefault();Console.WriteLine("FindAll Cache:{0}", student?.Name);Console.WriteLine();
根据主键查询
实体类自带一个根据主键查询的方法,不论主键字段名以及类型,即FindByKey方法
缓存
复杂查询
/// <summary>高级查询</summary>/// <param name="key"></param>/// <param name="roleId"></param>/// <param name="isEnable"></param>/// <param name="start"></param>/// <param name="end"></param>/// <param name="p"></param>/// <returns></returns>public static IList<TEntity> Search(String key, Int32 roleId, Boolean? isEnable, DateTime start, DateTime end, Pager p){var exp = _.LastLogin.Between(start, end);if (roleId > 0) exp &= _.RoleID == roleId | _.RoleIDs.Contains("," + roleId + ",");if (isEnable != null) exp &= _.Enable == isEnable;// 先精确查询,再模糊if (!key.IsNullOrEmpty()){var list = FindAll(exp & (_.Code == key | _.Name == key | _.DisplayName == key | _.Mail == key | _.Mobile == key), p);if (list.Count > 0) return list;exp &= (_.Code.Contains(key) | _.Name.Contains(key) | _.DisplayName.Contains(key) | _.Mail.Contains(key) | _.Mobile.Contains(key));// exp &= SearchWhereByKeys(key); 生成所有字段的模糊查询}return FindAll(exp, p);}
以上例子来自XCode自带的用户业务类的搜索方法。主要关注FindAll方法,以及exp参数。
由Field生成表达式WhereExpression,最后实际生成sql就是where后面其中一段,分页可由Pager提供。
WhereExpression部分演示
var exp = new WhereExpression();exp &= _.Did.In(dids);// 以下仅为演示,Field(继承自FieldItem)重载了==、!=、>、<、>=、<=等运算符if (userid > 0) exp &= _.OperatorID == userid;if (isSign != null) exp &= _.IsSign == isSign.Value;exp &= _.OccurTime.Between(start, end); // 大于等于start,小于end,当start/end大于MinValue时有效
模糊搜索可通过SearchWhereByKey方法生成指定字段的模糊查找语句
exp &= SearchWhereByKeys(key); 生成所有字段的模糊查询
多表查询
- “不支持”多表查询!为何不支持要加双引号?那是因为XCode实际上支持多表查询,只是用起来非常复杂,也不容易讲清楚,会严重影响基本功能的学习理解。
- 不支持多表查询,所以不是万能的,仅仅支持单表,所以是简单的,增删改查都得到了直接支持,完全能解决80%-90%以上的场景,所以是实用的。
- 如果是为了查询从表填充拓展属性,那么从表的查询启用缓存查询,多表查询变为多次查找缓存。
- 至于另外10%-20%,还有什么语法比sql更简洁?
- 通过以下语句获取DataSet,由于
net standard的一些驱动不支持CreateDataAdapter方法,用的是DbDataReader并填充到DbTable
DAL dal = DAL.Create("Common");DataSet ds = dal.Select("select * from table1");// 或者DbTable dt = dal.Query("select * from table1");
