• Dapper学习


    前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法.

    一、Read -- Rainbow原生

    1. 先看测试代码

    var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();
    using (var conn = new MySqlConnection(conStr))
    {
        var db = Rainbow.Init(conn, 2000);
    
        //Rainbow提供方法
        var entity = db.Teacher.Get(8);
    
        entity = db.Teacher.First();
    
        var listAll = db.Teacher.All();
    }

    Rainbow在读取数据这一块, 就只提供了这几个方法, 当然,  Dapper的方法, 在这里仍然是可以用的, 通过db.Query的方式就可以用了

    2. 源码解析

    /// <summary>
    /// Grab a record with a particular Id from the DB 
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public T Get(TId id)
    {
        return database.Query<T>("select * from " + TableName + " where " + "Id" + " = @id", new { id }).FirstOrDefault();
    }
    
    public virtual T First()
    {
        return database.Query<T>("select * from " + TableName + " LIMIT 1;").FirstOrDefault();
        //return database.Query<T>("select top 1 * from " + TableName).FirstOrDefault();
    }
    
    public IEnumerable<T> All()
    {
        return database.Query<T>("select * from " + TableName);
    }

    First方法需要作出修改, 以适应mysql. 不过First方法是虚方法, 在没有源码修改的情况下, 可以用类去继承重写就可以了, 也还是比较方便的.有源码的话, 更方便点

    这里的几个封装都是非常简单的, 近乎于赤裸裸的sql了, 不在多说

    二、自定义扩展

    1. 测试代码:

    var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();
    using (var conn = new MySqlConnection(conStr))
    {
        var db = Rainbow.Init(conn, 2000);
    
        //自定义扩展方法
        var list = db.Teacher.GetListBy(" No>@No", new { No = 6060 });
    
        var pageList = db.Teacher.GetPageList(1, 10, " No>@No", new { No = 6060 });
    }

    经测试, 是可以正常使用的. 接下来看一下代码

    2. 自定义方法

    /// <summary>
    /// 根据条件查询
    /// </summary>
    /// <param name="whereStr">不带where关键字</param>
    /// <returns></returns>
    public IEnumerable<T> GetListBy(string whereStr, dynamic param = null)
    {
        string sql = "select * from " + TableName;
        if (!string.IsNullOrWhiteSpace(whereStr))
            sql += " where " + whereStr;
    
        return database.Query<T>(sql, param);
    }

    此处的方法, 只适用于单表, 对于多表的查询, 可以直接使用Dapper的方法, 写sql.

    /// <summary>
    /// 分页方法
    /// </summary>
    /// <param name="pageIndex">当前页码</param>
    /// <param name="pageSize">每页显示条数</param>
    /// <param name="whereCondition">where条件</param>
    /// <param name="param">where条件中的参数列表</param>
    /// <param name="orderbyProperty">排序字段;如 name DESC 或者 id DESC,name ASC</param>
    /// <returns></returns>
    public virtual PagedResult<T> GetPageList(int pageIndex, int pageSize, string whereCondition = "", 
      dynamic param = null, string orderbyProperty = "") { if (pageIndex < 1) pageIndex = 1; var startItem = (pageIndex - 1) * pageSize; string where = string.IsNullOrEmpty(whereCondition) ? "" : " WHERE " + whereCondition; string orderby = string.IsNullOrEmpty(orderbyProperty) ? "" : " ORDER BY " + orderbyProperty; string sql = string.Format(@"SELECT * FROM {0} {1} {2} LIMIT {3},{4}; SELECT COUNT(1) FROM {0} {1}",
          TableName, where, orderby, startItem, pageSize); PagedResult<T> pagingResult = new PagedResult<T>(pageSize, pageIndex); using (var result = database.QueryMultiple(sql, param)) { List<T> list = result.Read<T>(); var totalCount = Convert.ToInt32(result.Read<long>()[0]); pagingResult.Data = list; pagingResult.TotalItemCount = totalCount; } return pagingResult; }

    这个就是单表的分页方法了, 如果想要多表的, 只需要稍微修改下这个方法, 就可以了. 就不贴了.

    这里牵涉到一个QueryMultiple方法, 是之前Dapper解析篇幅里面没有提到的, 这个方法是分次查询, 如果sql语句是多个sql语句拼接而成, 那么就可以读取多次以获取多个查询结果

  • 相关阅读:
    datetime模块
    time模块
    shelve模块
    json&pickle 序列化
    re正则
    MQ常用命令
    MQ for linux安装与卸载【转】
    Linux下安装Oracle11g服务器【转】
    PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)[转]
    [LeetCode]:116:Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/elvinle/p/6144175.html
Copyright © 2020-2023  润新知