亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:32:35
字體:
來源:轉載
供稿:網友

簡介

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

代碼

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

方法定義

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

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):

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+)

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);              }    }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
奇米成人av国产一区二区三区| 高清欧美性猛交xxxx黑人猛交| 成人欧美在线视频| 亚洲综合色激情五月| 亚洲国产一区二区三区四区| 黑人巨大精品欧美一区二区一视频| 中文字幕久久久| 欧美精品一区二区三区国产精品| 97香蕉超级碰碰久久免费的优势| 国内精品久久久久久影视8| 在线播放日韩av| 精品国产一区二区三区久久久| 欧美性在线视频| 国产精品视频一区国模私拍| 久久影视免费观看| 狠狠躁夜夜躁人人躁婷婷91| 国产欧美一区二区三区久久| 国产成人精品久久亚洲高清不卡| 亚洲午夜久久久久久久| 欧美激情videoshd| 欧美大片在线影院| 亚洲另类欧美自拍| 色偷偷88888欧美精品久久久| 夜夜躁日日躁狠狠久久88av| 国产成人综合精品| 欧美另类69精品久久久久9999| 久久久999成人| 午夜精品三级视频福利| 欧美日韩国产成人在线观看| 久久伊人色综合| www.欧美精品一二三区| 欧美日韩国产一中文字不卡| 欧美精品电影免费在线观看| 国产中文欧美精品| 久久成人18免费网站| 欧美做受高潮电影o| 欧美俄罗斯性视频| 亚洲大胆人体av| 国产精品综合久久久| 国产欧美在线视频| 亚洲欧美精品suv| 欧美丰满少妇xxxx| 国产精自产拍久久久久久蜜| 这里只有精品久久| 成人高h视频在线| 日韩激情视频在线播放| 欧美日韩国产在线| 亚洲欧美视频在线| 亚洲高清久久网| 国产日韩中文字幕| 久久av中文字幕| 久久久久久中文字幕| 免费99精品国产自在在线| 九九综合九九综合| 国产成人aa精品一区在线播放| 国产日韩欧美91| 国内精品伊人久久| 亚洲精品国产suv| 91久久国产婷婷一区二区| 亚洲第一视频网| 亚洲日本成人女熟在线观看| 欧美裸体男粗大视频在线观看| 国产精品中文字幕在线观看| 欧美小视频在线观看| 欧美自拍视频在线| 黑人欧美xxxx| 欧美大胆在线视频| 亚洲字幕一区二区| 精品调教chinesegay| 久久男人资源视频| 国产精品入口日韩视频大尺度| 亚洲在线www| 色综合色综合网色综合| 日韩性xxxx爱| 姬川优奈aav一区二区| 亚洲免费福利视频| 欧美激情亚洲综合一区| 精品欧美aⅴ在线网站| 国产欧美精品日韩| 色狠狠久久aa北条麻妃| 国产裸体写真av一区二区| 国产视频久久久久久久| 日韩大片免费观看视频播放| 伊人精品在线观看| 亚洲精品日韩av| 日韩av最新在线| 亚洲自拍偷拍一区| 91日本在线观看| 51色欧美片视频在线观看| 欧美电影免费观看高清完整| 日韩国产精品视频| 久久91亚洲精品中文字幕奶水| 久久露脸国产精品| 日韩亚洲精品视频| 亚洲另类xxxx| 亚洲人成电影网站色| 青草成人免费视频| 亚洲免费av电影| 91夜夜未满十八勿入爽爽影院| 国产z一区二区三区| xxav国产精品美女主播| 中文字幕亚洲综合| 69av视频在线播放| 高清欧美性猛交| 久久精品国产2020观看福利| 日韩视频免费大全中文字幕| 欧美日韩国产色视频| 国产一区玩具在线观看| 亚洲男子天堂网| 成人午夜黄色影院| 亚洲一区亚洲二区亚洲三区| 亚洲视频网站在线观看| 国产精品久久久久久久7电影| 欧美疯狂xxxx大交乱88av| 久久久免费av| 欧美日韩国产黄| 国产一区二区三区在线看| 色综合91久久精品中文字幕| 91精品美女在线| 久久久999精品视频| 国产精品91久久久久久| 国产欧美一区二区三区久久人妖| 美女啪啪无遮挡免费久久网站| 久久久成人精品视频| 久久久久久久国产精品视频| 欧美电影院免费观看| 久久久av亚洲男天堂| 91精品视频在线播放| 日韩av免费在线| 成人网中文字幕| 成人夜晚看av| 日韩中文字幕免费| 欧美激情小视频| 91精品综合视频| 成人国产精品久久久久久亚洲| 欧洲永久精品大片ww免费漫画| 91影院在线免费观看视频| 国产精品激情av电影在线观看| 亚洲美女喷白浆| 国产精品欧美激情在线播放| 亚洲最大福利网站| 欧美性xxxx极品高清hd直播| 浅井舞香一区二区| 日韩av网址在线| 亚洲国产中文字幕在线观看| 在线观看日韩av| 久久91亚洲精品中文字幕| 欧美精品videosex极品1| 97涩涩爰在线观看亚洲| 久久精品夜夜夜夜夜久久| 欧美激情一区二区久久久| 国产精品精品久久久久久| 精品一区二区亚洲| 丝袜一区二区三区| 国内精品中文字幕| 日日摸夜夜添一区| 一区二区欧美在线| 日日摸夜夜添一区| 国产精品国产三级国产aⅴ浪潮| 国产亚洲欧洲高清一区| 国产精品美乳在线观看| 午夜美女久久久久爽久久| 亚洲精品av在线播放| 久久九九精品99国产精品|