查询数据

  • 本节介绍XCode查询数据的各种方法
  1. var id = 1;
  2. // 根据主键查找
  3. var student = Student.FindByKey(id);
  4. Console.WriteLine("FindByKey:{0}", student.Name);
  5. Console.WriteLine();
  6. // 带条件查找
  7. student = Student.Find(Student._.ID == id & Student._.Sex == SexKinds.男);
  8. Console.WriteLine("Find:{0}", student.Name);
  9. Console.WriteLine();
  10. // 单对象缓存查找
  11. student = Student.Meta.SingleCache[id];
  12. Console.WriteLine("SingleCache:{0}", student.Name);
  13. Console.WriteLine();
  14. // 带分页查找
  15. var page = new PageParameter();
  16. page.Desc = true;
  17. page.Sort = Student._.ID;
  18. page.PageIndex = 1;
  19. page.PageSize = 5;
  20. student = Student.FindAll(Student._.ID == id, page).FirstOrDefault();
  21. Console.WriteLine("FindAll:{0}", student?.Name);
  22. Console.WriteLine();
  23. // 手写SQL查找
  24. student = Student.FindAll("Select * From Student").FirstOrDefault();
  25. Console.WriteLine("FindAll SQL:{0}", student?.Name);
  26. Console.WriteLine();
  27. // 实体缓存查找
  28. student = Student.Meta.Cache.Entities.FindAll(f=>f.ID == id).FirstOrDefault();
  29. Console.WriteLine("FindAll Cache:{0}", student?.Name);
  30. Console.WriteLine();

根据主键查询

实体类自带一个根据主键查询的方法,不论主键字段名以及类型,即FindByKey方法

缓存

  • 单体缓存适用于需要单行数据查询的场合,比如用户表等。
  • 实体缓存适用于系统参数表、栏目分类表等。

复杂查询

  1. /// <summary>高级查询</summary>
  2. /// <param name="key"></param>
  3. /// <param name="roleId"></param>
  4. /// <param name="isEnable"></param>
  5. /// <param name="start"></param>
  6. /// <param name="end"></param>
  7. /// <param name="p"></param>
  8. /// <returns></returns>
  9. public static IList<TEntity> Search(String key, Int32 roleId, Boolean? isEnable, DateTime start, DateTime end, Pager p)
  10. {
  11. var exp = _.LastLogin.Between(start, end);
  12. if (roleId > 0) exp &= _.RoleID == roleId | _.RoleIDs.Contains("," + roleId + ",");
  13. if (isEnable != null) exp &= _.Enable == isEnable;
  14. // 先精确查询,再模糊
  15. if (!key.IsNullOrEmpty())
  16. {
  17. var list = FindAll(exp & (_.Code == key | _.Name == key | _.DisplayName == key | _.Mail == key | _.Mobile == key), p);
  18. if (list.Count > 0) return list;
  19. exp &= (_.Code.Contains(key) | _.Name.Contains(key) | _.DisplayName.Contains(key) | _.Mail.Contains(key) | _.Mobile.Contains(key));
  20. // exp &= SearchWhereByKeys(key); 生成所有字段的模糊查询
  21. }
  22. return FindAll(exp, p);
  23. }

以上例子来自XCode自带的用户业务类的搜索方法。主要关注FindAll方法,以及exp参数。

Field生成表达式WhereExpression,最后实际生成sql就是where后面其中一段,分页可由Pager提供。

WhereExpression部分演示

  1. var exp = new WhereExpression();
  2. exp &= _.Did.In(dids);
  3. // 以下仅为演示,Field(继承自FieldItem)重载了==、!=、>、<、>=、<=等运算符
  4. if (userid > 0) exp &= _.OperatorID == userid;
  5. if (isSign != null) exp &= _.IsSign == isSign.Value;
  6. exp &= _.OccurTime.Between(start, end); // 大于等于start,小于end,当start/end大于MinValue时有效

模糊搜索可通过SearchWhereByKey方法生成指定字段的模糊查找语句

  1. exp &= SearchWhereByKeys(key); 生成所有字段的模糊查询

多表查询

  • “不支持”多表查询!为何不支持要加双引号?那是因为XCode实际上支持多表查询,只是用起来非常复杂,也不容易讲清楚,会严重影响基本功能的学习理解。
  • 不支持多表查询,所以不是万能的,仅仅支持单表,所以是简单的,增删改查都得到了直接支持,完全能解决80%-90%以上的场景,所以是实用的。
  • 如果是为了查询从表填充拓展属性,那么从表的查询启用缓存查询,多表查询变为多次查找缓存。
  • 至于另外10%-20%,还有什么语法比sql更简洁?
  • 通过以下语句获取DataSet,由于net standard的一些驱动不支持CreateDataAdapter方法,用的是DbDataReader并填充到DbTable
  1. DAL dal = DAL.Create("Common");
  2. DataSet ds = dal.Select("select * from table1");
  3. // 或者
  4. DbTable dt = dal.Query("select * from table1");