10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)

有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下:

技术:Mvc4+Dapper+Dapper扩展+Sqlserver

目前主要实现了两种分页:一种采用 PagedList.Mvc 实现的分页

两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。

功能相对比较简单仅供学习交流。

通用存储过程

复制代码
复制代码
 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
复制代码
复制代码

Dapper

复制代码
复制代码
 1   /// 
 2         /// 查询所有用户
 3         /// 
 4         /// 
 5         public List GetAllList()
 6         {
 7             var list = new List();
 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(sql,commandType: CommandType.Text).AsList();
14                 //dapper扩展写法
15                 list = conn.GetList().AsList();
16                 conn.Close();
17             }
18             return list;
19         }
复制代码
复制代码

Dapper分页

复制代码
复制代码
 1 /// 
 2         /// 采用存储过程分页
 3         /// 
 4         /// 
 5         /// 
 6         /// 
 7         public UserPage GetPageByProcList(int page=1,int pageSize=10)
 8         {
 9             UserPage model = new UserPage();
10             var list = new List();
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("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList();
26                 //标准写法
27                 //list = conn.Query(sql,commandType: CommandType.Text).AsList();
28                 //dapper扩展写法
29                 //list = conn.GetList().AsList();
30                 list = conn.Query("ProcViewPager", parm, commandType: CommandType.StoredProcedure).AsList();
31                 int totalCount = parm.Get("@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         }
复制代码
复制代码

View

复制代码
复制代码
 1 @{
 2     Layout = null;
 3 }
 4 
 5 
 6 
 7 
8 9 10 11 12 13 14 15 16 17 18 19
用户名真实姓名出生日期地址
20 21
22 25 26 27 28
复制代码
复制代码

截图

10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)_第1张图片

 


你可能感兴趣的:(Dapper)