目录

背景

解决方案

总结


背景

对于查询数据列表的功能,需要分页已经查询总数。这里涉及两句SQL,一个是查询分页对应的数据,第二个是Count(*); 会导致部分重复代码和两次的数据库查询。

解决方案

Dapper有封装QueryMultipleAsync的异步方法支持执行多条SQL,来减少数据库查询次数。

使用方法

 public async Task<(IEnumerable<Log> list,int total)> GetListAsync()
{
string sql = @"SELECT sql_calc_found_rows id, mark1, mark2, mark3
FROM logs ORDER BY id ASC LIMIT @Offset, @PageSize;
SELECT FOUND_ROWS() ";
DynamicParameters parameters = new DynamicParameters();
parameters.Add("@Offset", 0);
parameters.Add("@PageSize", 2); using var connection = _dapperContext.CreateConnection();
using var multi = await connection.QueryMultipleAsync(sql, parameters);
var list = await multi.ReadAsync<Log>();
var total = await multi.ReadSingleAsync<int>();
return (list, total);
}

这里是查询MYSQL,使用了sql_calc_found_rows在第一个查询分页数据的SQL中,第二条是SELECT FOUND_ROWS()来获取Limit之外的行数。

使用QueryMultipleAsync方法返回的是一个GridReader对象。这个对象提供了一些方法读取数据,比如

ReadReadAsync 返回可枚举的动态类型
Read<T>ReadAsync<T> 返回 T 参数指定类型的枚举
ReadFirstReadFirstAsync Returns the first row as a dynamic type
ReadFirst<T>ReadFirstAsync<T> 将第一行作为动态类型返回
ReadFirstOrDefaultReadFirstOrDefaultAsync 返回第一行作为 T 类型参数指定类型的实例
ReadFirstOrDefault<T>ReadFirstOrDefaultAsync<T> 将第一行作为动态类型返回,如果未返回任何结果,则返回 null
ReadSingleReadSingleAsync 返回第一行作为 T 类型参数指定类型的实例,如果没有返回结果则返回 null
ReadSingle<T>ReadSingleAsync<T> 在预期只返回一行时使用。 返回动态类型
ReadSingleOrDefaultReadSingleOrDefaultAsync 在预期返回零行或一行时使用。 返回动态类型或 null
 

示例中使用ReadAsync读取数据,ReadSingleAsync读取count然后返回元组

var list = await multi.ReadAsync<Log>();
var total = await multi.ReadSingleAsync<int>();
return (list, total);

总结

通过使用Dapper的QueryMultipleAsync一次性查询多个结果,减少了与数据库服务器的请求次数。减少了代码量。

【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL的更多相关文章

  1. C#实现执行多条SQl语句,实现数据库事务

    C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...

  2. c#中执行多条sql语句【ORA-00911: 无效字符】

    问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...

  3. Spring 中jdbcTemplate 实现执行多条sql语句

    说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里 ...

  4. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  5. java执行多条SQL语句

    一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建Databa ...

  6. 执行多条SQL语句,实现数据库事务(不可传入Sql参数)

    执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371

  7. 如何在Oracle中一次执行多条sql语句 (.net C#)

    关键是不能换行,要加上begin ...sql... end;     每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...

  8. jmert jdbc request支持执行多条sql语句并设置jdbc字符集

    1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...

  9. (学)如何在Oracle中一次执行多条sql语句

    队长同学原来的地址:https://www.cnblogs.com/teamleader/archive/2007/05/31/765943.html队长同学原来的描述: 有时我们需要一次性执行多条s ...

  10. mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

随机推荐

  1. 音质效果不错的Pcie声卡之CM8828听歌声卡

    CM8828芯片是cmedia骅讯公司生产的,采用这个芯片的声卡价格不一,便宜的100多,贵一点的500多.价位在100多买到这款声卡还是比较实惠的,再高一点的声卡都是堆料的.CM8828声卡是原生的 ...

  2. 四个常见的Linux面试问题

    四个常见的Linux面试问题. 刚毕业要找工作了,只要是你找工作就会有面试这个环节,那么在面试环节中,有哪些注意事项值得我的关注呢?特别是专业技术岗位,这样的岗位询问一般都是在职的工程师,如何在面试环 ...

  3. 《3D编程模式》写书-第1天记录

    大家好,我现在开始写书了,书名为:<3D编程模式> 我会在本系列博文中记录写书的整个过程,感谢大家支持! 这里是所有的的写书记录: <3D编程模式>写书记录 为什么写书 去年我 ...

  4. golang 中的 cronjob

    引言 最近做了一个需求,是定时任务相关的.以前定时任务都是通过 linux crontab 去实现的,现在服务上云(k8s)了,尝试了 k8s 的 CronJob,由于公司提供的是界面化工具,使用.查 ...

  5. ARM 详解

    一.ARM 的发展史 ARM 的发展历史可以追溯到 1978 年,当年克里斯·库里(Chris Currry)所任职的公司遭遇财务危机,发展每况愈下,库里在和创始人深入沟通后,决定离职.当时的库里对微 ...

  6. 二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网

    二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star ...

  7. [Shell] Windows上支持Linux Shell的工具/方法

    0 概述 1 方式一 : Windows Terminal 局限性: 不支持 xargs等命令 支持sed,find等命令 安装方式 安装Windows Terminal的最简单方法是通过Micros ...

  8. [Java]排序算法>插入排序>【折半插入排序】(O(N*N)/稳定/N较大/无序/顺序存储)

    1 折半插入排序 1.1 算法思想 相比于[直接插入排序]:采用"顺序查找法"查找当前记录在已排好序的序列中的插入位置, 折半插入排序利用"折半查找法"快速查出 ...

  9. UESTC__ACM 1264 人民币的构造

    链接地址:https://acm.uestc.edu.cn/contest/198/problem/J 我们都知道人民币的面值是1.2.5.10,为什么是这个数值呢,我们分析了下发现,从1~10的每个 ...

  10. 理解Linux系统: 进程

    Linux内核版本: 2.6.11.12 编写代码: 创建进程 创建进程使用fork系统调用,官方文档对于fork的描述: fork() creates a new process by duplic ...