激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 基于Dapper實現分頁效果 支持篩選、排序、結果集總數等

基于Dapper實現分頁效果 支持篩選、排序、結果集總數等

2020-05-13 15:34JIN Weijie ASP.NET教程

這篇文章主要為大家詳細介紹了基于Dapper實現分頁效果,支持篩選,排序,結果集總數,多表查詢,非存儲過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下

簡介

之前事先搜索了下博客園上關于Dapper分頁的實現,有是有,但要么是基于存儲過程,要么支持分頁,而不支持排序,或者搜索條件不是那么容易維護。

代碼

首先先上代碼: https://github.com/jinweijie/Dapper.PagingSample

方法定義

以下是我的一個分頁的實現,雖然不是泛型(因為考慮到where條件以及sql語句的搭配),但是應該可以算是比較通用的了,方法定義如下:

?
1
2
3
4
5
public Tuple<IEnumerable<Log>, 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.Config的連接字符串。

3. Ctrl+F5運行程序,示例項目里,我用了一個簡單的WinForm程序,但應該可以比較好的演示分頁效果。

基于Dapper實現分頁效果 支持篩選、排序、結果集總數等

多表支持

增加了示例,支持多表查詢,例如有兩個Log表,Level表,Log的LevelId字段引用Level的Id字段,通過以下的查詢,可以實現多表查詢的分頁,排序,過濾:

首先是通過兩次查詢的示例(基本支持所有版本Sql Server):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public Tuple<IEnumerable<Log>, 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.Query<int>(count.RawSql, count.Parameters).Single();
        var rows = connection.Query<Log>(selector.RawSql, selector.Parameters);
 
        return new Tuple<IEnumerable<Log>, int>(rows, totalCount);
      }
    }

第二個示例是通過Offset/Fetch查詢(支持Sql Server 2012+)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public Tuple<IEnumerable<Log>, 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.Query<Log>(selector.RawSql, selector.Parameters).ToList();
 
        if(rows.Count == 0)
          return new Tuple<IEnumerable<Log>, int>(rows, 0);
        
 
        return new Tuple<IEnumerable<Log>, int>(rows, rows[0].TotalCount);
        
      }
    }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧洲成人在线视频 | 欧美一级毛片特黄黄 | 黄色午夜剧场 | 日本中文高清 | 久久久久女人精品毛片 | 国产精品99久久99久久久二 | 黄色免费在线电影 | 欧美成人三级大全 | 性欧美在线视频 | 国产91久久久 | 久久久在线免费观看 | 黄色大片高清 | 免费观看国产精品视频 | 久久精品视频网站 | 欧美日韩一区二区综合 | 欧洲精品久久久 | 欧美色淫 | 日本在线看片 | 亚洲第一精品在线 | 国产69精品久久99不卡免费版 | 国产精品一区2区3区 | 在线看日本 | 日日爱夜夜操 | 九九热在线视频观看 | 国产自在自线午夜精品视频在 | 思思久而久而蕉人 | 国产一级www | 男女视频免费看 | 久久精品中文字幕 | 国产成人视屏 | 久久精品欧美一区 | 美女视频大全网站免费 | 成人毛片av在线 | 国产1区2区3区在线观看 | 欧美黄色免费视频 | 精品国产一区二 | 77成人影院 | 美女被免费网站在线软件 | 成人在线观看免费爱爱 | 久久精品中文字幕一区二区三区 | 成年性羞羞视频免费观看无限 |