查询数据

  • 本节介绍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");
上次更新: 2018-12-25 12:59:26