宝哥软件园

基于Dapper的分页效果支持过滤、排序、结果集总数等

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

简介

之前我在Blogger Park中提前搜索了Dapper分页的实现,但是要么是基于存储过程,要么是支持分页而不是排序,要么是搜索条件不好维护。

密码

首先,代码优先:https://github.com/jinweijie/Dapper.分页示例

方法定义

以下是我的分页实现之一。虽然它不是通用的(因为where条件和sql语句的搭配),但它应该被视为更通用的。该方法定义如下:

public TupleIEnumerableLog,int Find(LogSearchCriteria criteria,int pageIndex,int pageSize,string[] asc,string[]desc);上面的函数定义是查询日志的一个例子。在返回的结果中,Tuple的第一个值是结果集,第二个值是总行数(例如,总共有100条记录,每页10条,当前第一页,所以第一个值是10条记录,第二个值是100)

在示例项目中,我以两种方式实现了分页:

1.第一个是基于2的查询。第一次获得总数,第二次查询获得结果集。

2.第二个是基于1的查询,使用了SqlServer的off test/Fetch,所以只支持Sql Server 2012,所以大家根据自己的Sql Server版本选择不同的实现。当然,第二个在这里效率更高。

运行示例

1.将Github的Repo下载或克隆到本地后,转到数据库目录并解压缩Database.7z

2.附加到Sql服务器。我默认使用的是Sql Server LocalDB,连接字符串是data source=(local db) mssqllocaldb;初始目录=DapperPagingSample集成安全性=真;如果您没有使用本地数据库,请修改应用程序的连接字符串。请根据需要进行配置。

3.ctrl+F5运行程序。在示例项目中,我使用了一个简单的WinForm程序,但是它应该能够更好地演示分页效果。

多表支持

添加了支持多表查询的示例。例如,有两个日志表,级别表,日志的级别标识字段指的是级别标识字段。多表查询的分页、排序和过滤可以通过以下查询实现:

第一个是两个查询的例子(基本支持所有版本的Sql Server):

public TupleIEnumerableLog,int Find(LogSearchCriteria criteria,int pageIndex,int pageSize,string[] asc,string[]desc){ 0使用(IDbConnection connection=base .OpenConnection()){ const string COuntquery=@ ' SELECT COunt(1)FROM[Log]l INNER JOIN[LeveL]LV ON l . LeveL id=LV .id/* *其中* */';常量字符串SELECT查询=@ ' SELECT * FROM(SELECT ROW _ NUMBER())OVER(/* * order by * */)AS ROW num,l.*,lv .名称为[级别]从[日志]l内部连接[级别]LV开启.级别id=LV .id/* *其中* */)AS行constraineedresult WHERE行号=(@页面索引* @页面大小1)和行号=(@页面索引1)* @页面大小ORDER BY行号';SqlBuilder builder=new SqlBuilder();定义变量计数=构建器添加模板(计数查询);定义变量选择器=构建器AddTemplate(selectQuery,new { PageIndex=pageIndex,page size=page size });if(!字符串IsNullOrEmpty(条件级)构建器。其中(' lv .名称=@级别",新的{级别=标准. level });if(!字符串IsNullOrEmpty(条件。消息){ var msg='% '条件。消息"%";建筑商。其中(“l.Message Like @Message”,新的{ Message=msg });} foreach(ASC中的var a){ if(!字符串isnullorhitespace(a))构建器(a)命令。} foreach(desc的var d){ if(!字符串isnullorhitespace(d))生成器订单方(desc);} var totalCount=连接Queryint(计数RawSql,计数。参数)。single();var行数=连接QueryLog(选择器RawSql,选择器。参数);返回新的TupleIEnumerableLog,int(row,TotalCount);} }第二个示例是通过偏移/提取查询(支持Sql Server 2012)

public TupleIEnumerableLog,int FindWithoffsetFetch(LogSearcheCriteria criteria,int pageIndex,int pageSize,string[] asc,string[]desc){ 0使用(IDbConnection connection=base .OpenConnection()){ const string select query=@ ';WITH _data AS (SELECT l.*,lv .名称为[级别]从[日志]1内部连接[级别] lv开启。级别Id=lv .id/* *其中**/),_ COUNT AS(SELECT COUNT(1)AS total COUNT FROM _ data)SELECT * FROM _ data CROSS APPLY _ COUNT/* * order by * */OFFSET @ page index * @ page size ROWS FETCH NEXT @ page size ROWS ONLY ';SqlBuilder builder=new SqlBuilder();定义变量选择器=构建器AddTemplate(selectQuery,new { PageIndex=pageIndex,page size=page size });if(!字符串IsNullOrEmpty(条件级)构建器。其中(' lv .名称=@级别",新的{级别=标准. level });if(!字符串IsNullOrEmpty(条件。消息){ var msg='% '条件。消息"%";建筑商。其中(' l.Message Like @Message,new { Message=msg });} foreach(ASC中的var a){ if(!字符串isnullorhitespace(a))构建器(a)命令。} foreach(desc的var d){ if(!字符串isnullorhitespace(d))生成器订单方(desc);} var rows=connection .QueryLog(选择器RawSql,选择器。参数)。to list();if(第3行.计数==0)返回新的TupleIEnumerableLog,int(row,0);返回新的TupleIEnumerableLog,int(第行,第[0]行).总计数);} }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+