Dapper学习 - Dapper.Rainbow(三) - Read

前面已经介绍了新增/修改/删除了, 接下来介绍一下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语句拼接而成, 那么就可以读取多次以获取多个查询结果

时间: 2024-11-06 15:07:32

Dapper学习 - Dapper.Rainbow(三) - Read的相关文章

Dapper学习 - Dapper.Rainbow(二) - Update

上一篇介绍了Rainbow的Create方法, 这里就来介绍一下Update方法吧, 毕竟新增和修改是双胞兄弟嘛. 一.Update 测试代码: var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString(); using (var conn = new MySqlConnection(conStr)) { var db = Rainbow.Init(conn, 2000); try { db.BeginTr

Dapper学习 - Dapper的基本用法(一)

上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面的基本用法介绍中 提到用法, 首先是要实现CURD, 这里先介绍Read吧. 先上实体: public enum Gender { 男 = 0, 女 } public class Tch_Teacher { public int Id { get; set; } public Gender Sex { get

Dapper学习(三)之其他用法

这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, QueryFirstAsync, QueryFirstOrDefaultAsync, QuerySingleAsync, QuerySingleOrDefaultAsync, QueryMultipleAsync ExecuteAsync 用法示例: string sql = "INSERT INT

《CSS网站布局实录》学习笔记(三)

第三章 CSS网页布局与定位 3.1 div 几乎XHTML中的任何标签都可以用于浮动与定位,而div首当其冲.对于其他标签而言,往往有它自身存在的目的,而div元素存在的目的就是为了浮动与定位. 3.1.1 div是什么 div是XHTML中制定的.专门用于布局设计的容器对象.在传统表格式布局中,之所以能够进行页面的排版布局设计,完全依赖于表格对象table.如今,接触另一种布局方式--CSS布局.div正是这种布局方式的核心对象.仅从div的使用上说,做一个简单的布局只需要依赖两样东西:di

Android Window PhoneWindow Activity学习心得--第三弹

Android Window  PhoneWindow Activity学习心得--第三弹 前面 我们完成了从Activity到PhoneWindow的整体跨度 正如我们所知道的与Activity组件关联的一个应用程序窗口视图对象关联一个ViewRoot对象,而将 一个Activity组件的应用程序窗口视图对象与一个ViewRoot对象关联是通过该Activity组件所使用的 窗口管理器(WindowManager)来执行的. 在我们初始化DecorView完成之后,我们需要关联应用程序窗口视图

Linux学习之CentOS(三)----将Cent0S 7的网卡名称eno16777736改为eth0

Linux系统版本:CentOS_7(64位) 一.前言: 今天又从Centos 6.5装回了Centos 7,毕竟还是要顺应潮流嘛.安装完成之后,发现发现CentOS 7默认的网卡名称是eno16777736,如图所示: 像我这种有轻微强迫症的人看到这个名字总感觉不爽,于是偏要把eno16777736改成以前版本的eth0,那就开始吧. 二.修改CentOS 7的网卡名称: 输入如下命令,进入对应目录,编辑文件: vim /etc/sysconfig/grub 然后,往这个文件中添加“net.

《iOS应用逆向工程》学习笔记(三)iOS文件权限

一个组可以包含多个用户,一个用户可以属于多个组. iOS中的每个文件都有一个属主用户和属主组.每个文件都具有一系列的权限. 在iOS中用3bit表示文件的使用权,从高位到低位分别是r(read), w(write), x(execute)权限. 文件和用户的关系存在三种可能性:(1)此用户是属主用户:(2)此用户不是属主用户,但在属主组里:(3)此用户既不是属主用户,也不在属主组里. 例如: 111101101代表rwxr-xr-x,其8进制为755,它表示该文件的属主用户拥有r, w, x权限

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

内部类学习笔记(三)匿名内部类

这篇不转载了,自己来写,因为匿名内部类是内部类系列里我认为最难理解的. A.继承式的匿名内部类. 引用转载代码: 结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象. 建立匿名内部类的关键点是重写父类的一个或多个方法.再强调一下,是重写父类的方法,而不是创建新的方法.因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的.简言之,参考多态. 这里可能大家看的比较迷糊,尤其是 Car car = new Car(){ pub