首页后端开发ASP.NET利用Dapper实现分页效果方法教程

利用Dapper实现分页效果方法教程

时间2024-01-30 21:57:03发布访客分类ASP.NET浏览320
导读:收集整理的这篇文章主要介绍了利用Dapper实现分页效果方法教程,觉得挺不错的,现在分享给大家,也给大家做个参考。这篇文章主要为大家详细介绍了基于DapPEr实现分页效果,支持筛选,排序,结果集总数,多表查询,非存储过程,具有一定的参考价值...
收集整理的这篇文章主要介绍了利用Dapper实现分页效果方法教程,觉得挺不错的,现在分享给大家,也给大家做个参考。这篇文章主要为大家详细介绍了基于DapPEr实现分页效果,支持筛选,排序,结果集总数,多表查询,非存储过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

简介

之前事先搜索了下博客园上关于Dapper分页的实现,有是有,但要么是基于存储过程,要么支持分页,而不支持排序,或者搜索条件不是那么容易维护。

方法定义

以下是我的一个分页的实现,虽然不是泛型(因为考虑到where条件以及SQL语句的搭配),但是应该可以算是比较通用的了,方法定义如下:

public TupleIEnumerableLOG>
    , int>
     Find(LogSeArchCrITeria criteria      , int pageindex      , int pageSize      , string[] asc      , string[] desc);
    

以上函数定义是一个查询Log的示例,返回结果中,Tuple的第一个值是结果集,第二个值是总行数(例如,总共有100条记录,每页10条,当前第一页,那么第一个值是10条记录,第二个值是100)

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

1. 第一种是基于2此查询,第一次得到总数,第二次查询得到结果集。

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

运行示例

1. 将Github的Repo下载或者Clone到本地以后,到Database目录下,解压缩Database.7z

2. Attach到Sql Server上。默认我使用Sql Server LocalDB,连接字符串是 Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=DapperPagingSample; integrated security=True; 如果你用的不是LocalDB,请酌情修改App.@R_406_1058@的连接字符串。

3. Ctrl+F5运行程序,示例项目里,我用了一个简单的WinForm程序,但应该可以比较好的演示分页效果。

多表支持

增加了示例,支持多表查询,例如有两个Log表,Level表,Log的LevelId字段引用Level的Id字段,通过以下的查询,可以实现多表查询的分页,排序,过滤:

首先是通过两次查询的示例(基本支持所有版本Sql Server):

public TupleIEnumerableLog>
    , int>
 Find(LogSearchCriteria criteria      , int pageIndex      , int pageSize      , string[] asc      , string[] desc)    {
      using (IDbConnection connection = base.OpenConnection())      {
            const string countQuery = @"SELECT COUNT(1)                      From   [Log] l                      INNER JOIN [Level] lv ON l.LevelId = lv.Id                      /**where**/";
            const string selectQuery = @" SELECT *              From  ( SELECT  ROW_NUMBER() OVER ( /**orderby**/ ) AS RowNum, l.*, lv.Name as [Level]                   FROM   [Log] l                   INNER JOIN [Level] lv ON l.LevelId = lv.Id                   /**where**/                  ) AS RowConstrainedResult              WHERE  RowNum >
    = (@PageIndex * @PageSize + 1 )                AND RowNum = (@PageIndex + 1) * @PageSize              ORDER BY RowNum";
            SqlBuilder builder = new SqlBuilder();
            VAR count = builder.AddTemplate(countQuery);
        var selector = builder.AddTemplate(selectQuery, new {
 PageIndex = pageIndex, PageSize = pageSize }
    );
        if (!string.IsNullOrEmpty(criteria.Level))          builder.Where("lv.Name= @Level", new {
 Level = criteria.Level }
    );
        if (!string.IsNullOrEmpty(criteria.Message))        {
              var msg = "%" + criteria.Message + "%";
          builder.Where("l.Message Like @Message", new {
 Message = msg }
    );
        }
        foreach (var a in asc)        {
              if(!string.IsNullOrWhiteSpace(a))            builder.OrderBy(a);
        }
        foreach (var d in desc)        {
              if (!string.IsNullOrWhiteSpace(d))            builder.OrderBy(d + " desc");
        }
            var totalCount = connection.Queryint>
    (count.RawSql, count.Parameters).Single();
            var rows = connection.QueryLog>
    (selector.RawSql, selector.Parameters);
            return new TupleIEnumerableLog>
    , int>
    (rows, totalCount);
      }
    }
    

第二个示例是通过Offset/Fetch查询(支持Sql Server 2012+)

public TupleIEnumerableLog>
    , int>
 FindWithOffsetFetch(LogSearchCriteria criteria                        , int pageIndex                        , int pageSize                        , string[] asc                        , string[] desc)    {
      using (IDbConnection connection = base.OpenConnection())      {
                    const string selectQuery = @" ;
    WITH _data AS (                      SELECT l.*, lv.Name AS [Level]                      FROM   [Log] l                      INNER JOIN [Level] lv ON l.LevelId = lv.Id                      /**where**/                    ),                      _count AS (                        SELECT COUNT(1) AS TotalCount FROM _data                    )                    SELECT * FROM _data CROSS APPLY _count /**orderby**/ OFFSET @PageIndex * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY";
            SqlBuilder builder = new SqlBuilder();
                var selector = builder.AddTemplate(selectQuery, new {
 PageIndex = pageIndex, PageSize = pageSize }
    );
        if (!string.IsNullOrEmpty(criteria.Level))          builder.Where("lv.Name = @Level", new {
 Level = criteria.Level }
    );
        if (!string.IsNullOrEmpty(criteria.Message))        {
              var msg = "%" + criteria.Message + "%";
          builder.Where("l.Message Like @Message", new {
 Message = msg }
    );
        }
                foreach (var a in asc)        {
              if (!string.IsNullOrWhiteSpace(a))            builder.OrderBy(a);
        }
        foreach (var d in desc)        {
              if (!string.IsNullOrWhiteSpace(d))            builder.OrderBy(d + " desc");
        }
                    var rows = connection.QueryLog>
    (selector.RawSql, selector.Parameters).ToList();
            if(rows.Count == 0)          return new TupleIEnumerableLog>
    , int>
    (rows, 0);
                    return new TupleIEnumerableLog>
    , int>
    (rows, rows[0].TotalCount);
              }
    }
    

以上就是利用Dapper实现分页效果方法教程的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

Dapper分页"效果

若转载请注明出处: 利用Dapper实现分页效果方法教程
本文地址: https://pptw.com/jishu/593089.html
.NET Core创建一个控制台(Console)程序 jquery怎样去除元素内容

游客 回复需填写必要信息