【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL
目录
背景
对于查询数据列表的功能,需要分页已经查询总数。这里涉及两句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对象。这个对象提供了一些方法读取数据,比如
Read, ReadAsync |
返回可枚举的动态类型 |
Read<T>, ReadAsync<T> |
返回 T 参数指定类型的枚举 |
ReadFirst, ReadFirstAsync |
Returns the first row as a dynamic type |
ReadFirst<T>, ReadFirstAsync<T> |
将第一行作为动态类型返回 |
ReadFirstOrDefault, ReadFirstOrDefaultAsync |
返回第一行作为 T 类型参数指定类型的实例 |
ReadFirstOrDefault<T>, ReadFirstOrDefaultAsync<T> |
将第一行作为动态类型返回,如果未返回任何结果,则返回 null |
ReadSingle, ReadSingleAsync |
返回第一行作为 T 类型参数指定类型的实例,如果没有返回结果则返回 null |
ReadSingle<T>, ReadSingleAsync<T> |
在预期只返回一行时使用。 返回动态类型 |
ReadSingleOrDefault, ReadSingleOrDefaultAsync |
在预期返回零行或一行时使用。 返回动态类型或 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的更多相关文章
- C#实现执行多条SQl语句,实现数据库事务
C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...
- c#中执行多条sql语句【ORA-00911: 无效字符】
问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...
- Spring 中jdbcTemplate 实现执行多条sql语句
说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里 ...
- MyBatis一次执行多条SQL语句
MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...
- java执行多条SQL语句
一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建Databa ...
- 执行多条SQL语句,实现数据库事务(不可传入Sql参数)
执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371
- 如何在Oracle中一次执行多条sql语句 (.net C#)
关键是不能换行,要加上begin ...sql... end; 每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...
- jmert jdbc request支持执行多条sql语句并设置jdbc字符集
1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...
- (学)如何在Oracle中一次执行多条sql语句
队长同学原来的地址:https://www.cnblogs.com/teamleader/archive/2007/05/31/765943.html队长同学原来的描述: 有时我们需要一次性执行多条s ...
- mysql -- 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
随机推荐
- JVM加载中初始化时机?什么时候不会进行初始化?
初始化的过程是给静态变量赋予指定值以及执行静态代码块的过程. 当遇到new,getstatic,putstatic,invokestatic指令时要进行初始化,也就是new实例化对象,调用静态变量以及 ...
- TCP三次握手,四次分手。个人感觉最容易理解的解释
三次握手 名词解释 SYN,ACK,FIN存放在TCP的标志位,一共有6个字符,这里就介绍这三个: SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接,至于第三次什么 ...
- 快速部署Ceph分布式高可用集群
快速部署Ceph分布式高可用集群 Ceph简介 Ceph是一个PB,EB级别的分布式存储系统,可以提供文件存储,对象存储.和块存储,它可靠性高,易扩展,管理简便,其中对象存储和块存储可以和其他云平台集 ...
- CentOS 落幕,将于2021年底结束维护
官方最新消息: 译文: CentOS项目的未来是CentOS Stream,明年,我们将把重点从重建Red Hat Enterprise Linux(RHEL)的CentOS Linux转移到Cent ...
- 1.使用cookie简单实现单点登录流程
1.动手 实现了简单使用多系统,单一位置同时登陆,以及注销 主要认证中心流程代码编写在为在sso-login包下的ViewConreoller和LoginController:各系统的用户名显示是写在 ...
- Springboot集成MyBatis进行开发
引入相关的依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifact ...
- 第2章. reco主题介绍
1. 这是一个vuepress主题,旨在添加博客所需的分类.TAB墙.分页.评论等能: 2. 主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用: 3. 你可以打开 [午 ...
- Spring Security 报:Encoded password does not look like BCrypt
SpringBoot 集成 Security 时,报 Encoded password does not look like BCrypt 原因:SecurityConfig 必须 Bean 的形式实 ...
- Vue 前端开发团队风格指南(史上最全)
Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,本文根据项目实际情况整理了一份适用于团队开发的vue风格指南,供大家参考. 一.命名规范 常用的命名规范: camelCas ...
- LeetCode 双周赛 104(2023/05/13)流水的动态规划,铁打的结构化思考
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 往期回顾:LeetCode 单周赛第 344 场 · 手写递归函数的通用套路 T1. 老人的数目(Easy) ...