有時候大數據量進行查詢操做的時候,查詢速度很大強度上能夠影響用戶體驗,所以本身簡單寫了一個demo,簡單總結記錄一下:javascript
技術:Mvc4+Dapper+Dapper擴展+Sqlservercss
目前主要實現了兩種分頁:一種採用 PagedList.Mvc 實現的分頁html
兩外一種採用 ajax異步加載分頁 採用比較經常使用的jquery.pagination 分頁插件。java
功能相對比較簡單僅供學習交流。jquery
通用存儲過程git
1 USE [MvcProcPageDB] 2 GO 3 4 /****** Object: StoredProcedure [dbo].[ProcViewPager] Script Date: 2017/4/23 16:41:16 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 CREATE PROCEDURE [dbo].[ProcViewPager] ( 12 @recordTotal INT OUTPUT, --輸出記錄總數 13 @viewName VARCHAR(800), --表名 14 @fieldName VARCHAR(800) = '*', --查詢字段 15 @keyName VARCHAR(200) = 'Id', --索引字段 16 @pageSize INT = 20, --每頁記錄數 17 @pageNo INT =1, --當前頁 18 @orderString VARCHAR(200), --排序條件 19 @whereString VARCHAR(800) = '1=1' --WHERE條件 20 ) 21 AS 22 BEGIN 23 DECLARE @beginRow INT 24 DECLARE @endRow INT 25 DECLARE @tempLimit VARCHAR(200) 26 DECLARE @tempCount NVARCHAR(1000) 27 DECLARE @tempMain VARCHAR(1000) 28 --declare @timediff datetime 29 30 set nocount on 31 --select @timediff=getdate() --記錄時間 32 33 SET @beginRow = (@pageNo - 1) * @pageSize + 1 34 SET @endRow = @pageNo * @pageSize 35 SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR) 36 37 --輸出參數爲總記錄數 38 SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp' 39 EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT 40 41 --主查詢返回結果集 42 SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit 43 44 --PRINT @tempMain 45 EXECUTE (@tempMain) 46 --select datediff(ms,@timediff,getdate()) as 耗時 47 48 set nocount off 49 END 50 51 52 GO
Dappergithub
1 /// <summary> 2 /// 查詢全部用戶 3 /// </summary> 4 /// <returns></returns> 5 public List<UserInfo> GetAllList() 6 { 7 var list = new List<UserInfo>(); 8 //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo"; 9 using (SqlConnection conn = new SqlConnection(constr)) 10 { 11 conn.Open(); 12 //標準寫法 13 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList(); 14 //dapper擴展寫法 15 list = conn.GetList<UserInfo>().AsList(); 16 conn.Close(); 17 } 18 return list; 19 }
Dapper分頁ajax
1 /// <summary> 2 /// 採用存儲過程分頁 3 /// </summary> 4 /// <param name="page"></param> 5 /// <param name="pageSize"></param> 6 /// <returns></returns> 7 public UserPage GetPageByProcList(int page=1,int pageSize=10) 8 { 9 UserPage model = new UserPage(); 10 var list = new List<UserInfo>(); 11 //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo"; 12 using (SqlConnection conn = new SqlConnection(constr)) 13 { 14 conn.Open(); 15 DynamicParameters parm = new DynamicParameters(); 16 parm.Add("viewName", "UserInfo"); 17 parm.Add("fieldName", "*"); 18 parm.Add("keyName", "Id"); 19 parm.Add("pageSize", pageSize); 20 parm.Add("pageNo", page); 21 parm.Add("orderString", "Id"); 22 parm.Add("recordTotal", 0, DbType.Int32, ParameterDirection.Output); 23 //參數名得和存儲過程的變量名相同(參數能夠跳躍傳,鍵值對方式便可) 24 //強類型 25 //list = conn.Query<UserInfo>("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList(); 26 //標準寫法 27 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList(); 28 //dapper擴展寫法 29 //list = conn.GetList<UserInfo>().AsList(); 30 list = conn.Query<UserInfo>("ProcViewPager", parm, commandType: CommandType.StoredProcedure).AsList(); 31 int totalCount = parm.Get<int>("@recordTotal");//返回總頁數 32 model.user = list; 33 model.TotalCount = totalCount; 34 conn.Close(); 35 } 36 return model; 37 }
1 public ActionResult Index(int page=1) 2 { 3 4 #region 插入10條數據 5 6 //for (int i = 1; i <= 100000; i++) 7 //{ 8 // list.Add( 9 // new UserInfo 10 // { 11 // Id = Guid.NewGuid().ToString(), 12 // UserName = "xiaoming" + i, 13 // Birthday = Convert.ToDateTime("1987-12-11"), 14 // Gender = 1, 15 // LocalAddress = "河南省", 16 // TrueName = "小明" + i, 17 // Nation = "漢族" 18 // }); 19 //} 20 //ss.InsertAll(list); 21 #endregion 22 var pagelist = service.GetAllList().ToPagedList(page,10); 23 return View(pagelist); 24 } 25 public ActionResult ProcPageIndex(int page=1) 26 { 27 var list = service.GetPageByProcList(page,5); 28 return View(); 29 } 30 public JsonResult GetProList(int page=1,int pagesize=10) 31 { 32 var model = service.GetPageByProcList(page, pagesize); 33 return Json(model, JsonRequestBehavior.AllowGet); 34 }
Viewsql
1 @{ 2 Layout = null; 3 } 4 <link href="~/Content/bootstrap.css" rel="stylesheet" /> 5 <link href="~/Content/PagedList.css" rel="stylesheet" /> 6 <link href="~/Scripts/pagination.css" rel="stylesheet" /> 7 <div class="well"> 8 <table class="table"> 9 <thead> 10 <tr> 11 <th>用戶名</th> 12 <th>真實姓名</th> 13 <th>出生日期</th> 14 <th>地址</th> 15 </tr> 16 </thead> 17 <tbody id="tbodylist"></tbody> 18 19 </table> 20 21 </div> 22 <div id="Pagination" class="pagination"> 23 24 </div> 25 <script src="~/Scripts/jquery-1.9.1.min.js"></script> 26 <script src="~/Scripts/jquery.pagination.js"></script> 27 <script src="~/Scripts/bootstrap.js"></script> 28 <script type="text/javascript"> 29 //分頁查詢開始 30 $(document).ready(function () { 31 getDataList(0, null); 32 }); 33 34 var pagesize = 50; 35 var page = 1; 36 var initFlag = true; 37 38 function getDataList(currPage, jg) { 39 40 $.ajax({ 41 url: "/Home/GetProList", 42 type: "get", 43 dataType: 'json', 44 data: { pagesize: pagesize, page: currPage + 1 }, 45 contentType: "application/x-www-form-urlencoded; charset=utf-8", 46 success: function (response) { 47 if (response.user != null && response.user != "" && response.TotalCount != undefined && response.TotalCount > 0) { 48 if (initFlag) { 49 $("#Pagination").pagination( 50 response.TotalCount, 51 { 52 items_per_page: pagesize, 53 num_edge_entries: 1, 54 num_display_entries: 8, 55 callback: getDataList//回調函數 56 }); 57 initFlag = false; 58 } 59 $("#tbodylist").html(""); 60 loadDataList(response.user); 61 } else { 62 63 } 64 65 } 66 }); 67 } 68 69 function loadDataList(listdata) {71 var tbody = ""; 72 $(listdata).each(function (i, n) { 73 //表格 74 tbody += "<tr>" + 75 "<td>" + n.UserName + "</td>" + 76 "<td>" + n.TrueName + "</td>" + 77 "<td>" + n.Birthday + "</td>" + 78 "<td>" + n.LocalAddress + "</td>" + 79 "</tr>"; 80 }); 81 $("#tbodylist").html(html); 82 83 } 84 //分頁查詢結束 85 </script>
截圖json
項目地址:https://github.com/hgmsq/mvcprocpage