国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

基于Dapper實現(xiàn)分頁效果 支持篩選、排序、結果集總數(shù)等

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

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

簡介

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

代碼

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

方法定義

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

?
1
2
3
4
5
public Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
      , int pageIndex
      , int pageSize
      , string[] asc
      , string[] desc);

以上函數(shù)定義是一個查詢Log的示例,返回結果中,Tuple的第一個值是結果集,第二個值是總行數(shù)(例如,總共有100條記錄,每頁10條,當前第一頁,那么第一個值是10條記錄,第二個值是100)

在示例項目中,我用兩種方法實現(xiàn)了分頁:

1. 第一種是基于2此查詢,第一次得到總數(shù),第二次查詢得到結果集。

2. 第二種是基于1此查詢,用了SqlServer 的Offest/Fetch,所以只支持Sql Server 2012+,所以大家根據(jù)自己用的Sql Server版本選擇不同的實現(xiàn),這里當然是第二種實現(xiàn)效率更高一點。

運行示例

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實現(xiàn)分頁效果 支持篩選、排序、結果集總數(shù)等

多表支持

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

首先是通過兩次查詢的示例(基本支持所有版本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);
        
      }
    }

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕亚洲一区二区三区 | 欧美一区二区三区视频在线观看 | 黄色毛片在线看 | 亚洲精品成人 | 在线免费观看激情视频 | 色五月激情五月 | 精品一区二区三区视频 | 日韩精品成人 | 91视频导航| 免费午夜电影 | 久久中国精品 | 国产在线一区不卡 | 亚洲第一视频 | 欧美日在线| 欧美大片在线观看 | 在线观看av网站永久 | 国产农村妇女精品久久 | 午夜在线 | 伊人网电影 | 欧美一级在线观看 | 日日夜夜精品 | 91久久精品国产 | 毛片免费观看视频 | 欧美日韩精品一区二区三区 | 2018啪一啪| 97精品国产97久久久久久粉红 | 日本三级中文在线电影 | 久久久精品网站 | 黄色一级毛片免费看 | 国产日韩欧美综合 | h色视频在线观看 | 榴莲视频成人在线观看 | 国产美女一区二区三区 | 国产欧美在线 | 亚洲免费视频网站 | www.成人 | 日韩欧美视频 | 久热国产视频 | 免费看片www| 国产日韩精品一区 | 99亚洲伊人久久精品影院 |