精华内容
下载资源
问答
  • 主要为大家详细介绍了基于Dapper实现分页效果,支持筛选,排序,结果集总数,多表查询,非存储过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 之前事先搜索了下博客园上关于Dapper分页实现,有是有,但要么是基于存储过程,要么支持分页,而不支持排序,或者搜索条件不是那么容易维护。 代码 首先先上代码:...

    简介

    之前事先搜索了下博客园上关于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程序,但应该可以比较好的演示分页效果。

    多表支持

    增加了示例,支持多表查询,例如有两个Log表,Level表,Log的LevelId字段引用Level的Id字段,通过以下的查询,可以实现多表查询的分页,排序,过滤:

    首先是通过两次查询的示例(基本支持所有版本Sql Server):

     1 public Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
     2             , int pageIndex
     3             , int pageSize
     4             , string[] asc
     5             , string[] desc)
     6         {
     7             using (IDbConnection connection = base.OpenConnection())
     8             {
     9                 const string countQuery = @"SELECT COUNT(1)
    10                                             FROM      [Log] l
    11                                             INNER JOIN [Level] lv ON l.LevelId = lv.Id
    12                                             /**where**/";
    13 
    14                 const string selectQuery = @"  SELECT  *
    15                             FROM    ( SELECT    ROW_NUMBER() OVER ( /**orderby**/ ) AS RowNum, l.*, lv.Name as [Level]
    16                                       FROM      [Log] l
    17                                       INNER JOIN [Level] lv ON l.LevelId = lv.Id
    18                                       /**where**/
    19                                     ) AS RowConstrainedResult
    20                             WHERE   RowNum >= (@PageIndex * @PageSize + 1 )
    21                                 AND RowNum <= (@PageIndex + 1) * @PageSize
    22                             ORDER BY RowNum";
    23 
    24                 SqlBuilder builder = new SqlBuilder();
    25 
    26                 var count = builder.AddTemplate(countQuery);
    27                 var selector = builder.AddTemplate(selectQuery, new { PageIndex = pageIndex, PageSize = pageSize });
    28 
    29                 if (!string.IsNullOrEmpty(criteria.Level))
    30                     builder.Where("lv.Name= @Level", new { Level = criteria.Level });
    31 
    32                 if (!string.IsNullOrEmpty(criteria.Message))
    33                 {
    34                     var msg = "%" + criteria.Message + "%";
    35                     builder.Where("l.Message Like @Message", new { Message = msg });
    36                 }
    37 
    38                 foreach (var a in asc)
    39                 {
    40                     if(!string.IsNullOrWhiteSpace(a))
    41                         builder.OrderBy(a);
    42                 }
    43 
    44                 foreach (var d in desc)
    45                 {
    46                     if (!string.IsNullOrWhiteSpace(d))
    47                         builder.OrderBy(d + " desc");
    48                 }
    49 
    50                 var totalCount = connection.Query<int>(count.RawSql, count.Parameters).Single();
    51                 var rows = connection.Query<Log>(selector.RawSql, selector.Parameters);
    52 
    53                 return new Tuple<IEnumerable<Log>, int>(rows, totalCount);
    54             }
    55         }

    第二个示例是通过Offset/Fetch查询(支持Sql Server 2012+)

     1 public Tuple<IEnumerable<Log>, int> FindWithOffsetFetch(LogSearchCriteria criteria
     2                                                 , int pageIndex
     3                                                 , int pageSize
     4                                                 , string[] asc
     5                                                 , string[] desc)
     6         {
     7             using (IDbConnection connection = base.OpenConnection())
     8             {
     9                
    10                 const string selectQuery = @" ;WITH _data AS (
    11                                             SELECT l.*, lv.Name AS [Level]
    12                                             FROM      [Log] l
    13                                             INNER JOIN [Level] lv ON l.LevelId = lv.Id
    14                                             /**where**/
    15                                         ),
    16                                             _count AS (
    17                                                 SELECT COUNT(1) AS TotalCount FROM _data
    18                                         )
    19                                         SELECT * FROM _data CROSS APPLY _count /**orderby**/ OFFSET @PageIndex * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY";
    20 
    21                 SqlBuilder builder = new SqlBuilder();
    22                 
    23                 var selector = builder.AddTemplate(selectQuery, new { PageIndex = pageIndex, PageSize = pageSize });
    24 
    25                 if (!string.IsNullOrEmpty(criteria.Level))
    26                     builder.Where("lv.Name = @Level", new { Level = criteria.Level });
    27 
    28                 if (!string.IsNullOrEmpty(criteria.Message))
    29                 {
    30                     var msg = "%" + criteria.Message + "%";
    31                     builder.Where("l.Message Like @Message", new { Message = msg });
    32                 }
    33                 
    34                 foreach (var a in asc)
    35                 {
    36                     if (!string.IsNullOrWhiteSpace(a))
    37                         builder.OrderBy(a);
    38                 }
    39 
    40                 foreach (var d in desc)
    41                 {
    42                     if (!string.IsNullOrWhiteSpace(d))
    43                         builder.OrderBy(d + " desc");
    44                 }
    45                 
    46                 var rows = connection.Query<Log>(selector.RawSql, selector.Parameters).ToList();
    47 
    48                 if(rows.Count == 0)
    49                     return new Tuple<IEnumerable<Log>, int>(rows, 0);
    50                 
    51 
    52                 return new Tuple<IEnumerable<Log>, int>(rows, rows[0].TotalCount);
    53                 
    54             }
    55         }

     

    谢谢

    希望对大家有帮助:)

    最后,我更新了本篇随便,增加了内容,希望不要再被撤下了(上次撤下说是因为篇幅太短。。。),因为个人觉得这个对大家应该还是会有用的。

    转载于:https://www.cnblogs.com/jinweijie/p/dapper_pagination.html

    展开全文
  • NETMVC+Dapper+EasyUI实现增删改查和分页

    热门讨论 2015-07-09 22:10:00
    NETMVC+Dapper+EasyUI实现增删改查和分页,使用VS2013+SQL2008
  • 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验...目前主要实现了两种分页:一种采用 PagedList.Mvc 实现分页 两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。
  • 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下:技术:Mvc4+Dapper+Dapper扩展+Sqlserver目前主要实现了两种分页:一种采用 PagedList.Mvc ...

    有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个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   /// <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分页

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

    View

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

    截图

     


    展开全文
  • 本文简单介绍一下QueryMultiple的用法,并给出用QueryMultiple来实现SQL Server存储过程分页

    转载请注明出处
    http://blog.csdn.net/weijian300/article/details/50463307
    本文简单介绍一下QueryMultiple的用法,并给出用QueryMultiple来实现SQL Server存储过程分页
    先放一个网上找的分页过程,出自哪里不记得了,原文作者别见怪

    --分页存储过程  
    CREATE PROCEDURE [dbo].[Pro_System_DataPaging]
        (
          @Tables VARCHAR(1000) ,                --表名/视图名
          @PrimaryKey VARCHAR(100) ,             --主键
          @Sort VARCHAR(200) = NULL ,            --排序字段(不带order by)
          @pageindex INT = 1 ,                    --当前页码
          @PageSize INT = 10 ,                    --每页记录数
          @Fields VARCHAR(1000) = N'*' ,         --输出字段
          @Filter VARCHAR(8000) = NULL ,         --where过滤条件(不带where)
          @Group VARCHAR(1000) = NULL --,          --Group语句(不带Group By)
          --@DataCount INT OUTPUT                 --总记录数
        )
    AS 
        DECLARE @SortTable VARCHAR(100) 
        DECLARE @SortName VARCHAR(100) 
        DECLARE @strSortColumn VARCHAR(200) 
        DECLARE @operator CHAR(2) 
        DECLARE @type VARCHAR(100) 
        DECLARE @prec INT 
    
    --设定排序语句
        IF @Sort IS NULL
            OR @Sort = '' 
            SET @Sort = @PrimaryKey      
        IF CHARINDEX('DESC', @Sort) > 0 
            BEGIN         
                SET @strSortColumn = REPLACE(@Sort, 'DESC', '')         
                SET @operator = '<='     
            END 
        ELSE 
            BEGIN                
                SET @strSortColumn = REPLACE(@Sort, 'ASC', '')                
                SET @operator = '>='     
            END 
        IF CHARINDEX('.', @strSortColumn) > 0 
            BEGIN         
                SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.', @strSortColumn))
                SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.', @strSortColumn) + 1, LEN(@strSortColumn))     
            END 
        ELSE 
            BEGIN         
                SET @SortTable = @Tables         
                SET @SortName = @strSortColumn  
            END 
    
    --设置排序字段类型和精度 
        SELECT  @type = t.name ,
                @prec = c.prec
        FROM    sysobjects o
                JOIN syscolumns c ON o.id = c.id
                JOIN systypes t ON c.xusertype = t.xusertype
        WHERE   o.name = @SortTable
                AND c.name = @SortName
    
        IF CHARINDEX('char', @type) > 0 
            SET @type = @type + '(' + CAST(@prec AS VARCHAR) + ')'
    
        DECLARE @strPageSize VARCHAR(50) 
        DECLARE @strStartRow VARCHAR(50) 
        DECLARE @strFilter VARCHAR(1000) 
        DECLARE @strSimpleFilter VARCHAR(1000) 
        DECLARE @strGroup VARCHAR(1000)  
    
        IF @pageindex < 1 
            SET @pageindex = 1  
        SET @strPageSize = CAST(@PageSize AS VARCHAR(50)) 
    --设置开始分页记录数 
        SET @strStartRow = CAST(( ( @pageindex - 1 ) * @PageSize + 1 ) AS VARCHAR(50))  
    --筛选以及分组语句
        IF @Filter IS NOT NULL
            AND @Filter != '' 
            BEGIN         
                SET @strFilter = ' WHERE ' + @Filter + ' ' 
                SET @strSimpleFilter = ' AND ' + @Filter + ' ' 
            END 
        ELSE 
            BEGIN         
                SET @strSimpleFilter = ''         
                SET @strFilter = ''     
            END 
        IF @Group IS NOT NULL
            AND @Group != '' 
            SET @strGroup = ' GROUP BY ' 
    --执行查询语句    
        EXEC(
        '
        DECLARE @SortColumn ' + @type + '
        SET ROWCOUNT ' + @strStartRow + '
        SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
        SET ROWCOUNT ' + @strPageSize + '
        SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
        '
        )       
    
    --计算总记录数,总页数
        DECLARE @DataCountSql NVARCHAR(1000)
        SET @DataCountSql = N'SELECT COUNT(' + @PrimaryKey + N') AS DataCount,CEILING(COUNT(' + @PrimaryKey + N')/' + CONVERT(VARCHAR(10),@PageSize) + '.000) AS PageCount'+ N' FROM ' + @Tables + @strFilter
        --EXEC sp_executesql @DataCountSql, N'@DataCount int', @DataCount OUTPUT
        EXEC(@DataCountSql)

    CREATE TABLE [dbo].[TestColumn](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [NAME] [nvarchar](150) NULL,
        [ModifiedOn] [smalldatetime] NULL
        )

    OK,接下来新建个控制台项目

            private const string Sqlconnection = @"Data Source=.\MSSQLSERVER2008;Initial Catalog=DapperTest;User Id=sa;Password=123456;";//连接自己改
    
            public static SqlConnection OpenConnection()
            {
                var connection = new SqlConnection(Sqlconnection);
                connection.Open();
                return connection;
            }
    
            /// <summary>
            /// 单个结果集
            /// </summary>
            /// <returns>查询结果</returns>
            public static IEnumerable<TestColumn> SelectTestColumns()
            {
                using (IDbConnection conn = OpenConnection())
                {
                    const string query = "select * from TestColumn order by id desc";
                    return conn.Query<TestColumn>(query, null);
                }
            }
    
            /// <summary>
            /// 多个结果集
            /// </summary>
            /// <param name="sysPaging">分页信息</param>
            /// <returns>查询结果</returns>
            public static IEnumerable<TestColumn> SelectTestColumns(out List<SysPaging> sysPaging)
            {
                using (IDbConnection conn = OpenConnection())
                {
                    const string query = "EXEC [dbo].[Pro_System_DataPaging] @Tables = N'TestColumn',@PrimaryKey = N'ID',@Sort = N'ID',@pageindex = 1,@PageSize = 10,@Fields = '[Id],[NAME],[ModifiedOn]',@Filter = NULL,@Group = NULL";
                    var result = conn.QueryMultiple(query);
    
                    //这里一定要分别单独接收之后,再进行return
                    var resultGird = result.Read<TestColumn>().ToList();
                    var paging = result.Read<SysPaging>().ToList();
                    sysPaging = paging.ToList<SysPaging>();
    
                    return resultGird;
                }
            }
    
            static void Main(string[] args)
            {
                var paging = new List<SysPaging>();
                var allTestColumns = SelectTestColumns(out paging).ToList<TestColumn>();
    
                foreach (var testColumn in allTestColumns.Where(c => c.Parentid == 0))
                {
                    Console.Out.WriteLine("Id==>" + testColumn.Id + "\t");
                    Console.Out.WriteLine("Name==>" + testColumn.Name + "\t");
                    Console.Out.WriteLine("时间==>" + testColumn.ModifiedOn + "\t");
                }
    
                Console.Out.WriteLine("DataCount==>" + paging[0].DataCount);
                Console.Out.WriteLine("PageCount==>" + paging[0].PageCount);
    
                Console.ReadLine();
            }

    其实在Dapper中也有介绍QueryMultiple的用法
    官网:http://code.google.com/p/dapper-dot-net/
    GitHub:https://github.com/StackExchange/dapper-dot-net

    展开全文
  • 有时候大数据量进行查询操作的时候,...目前主要实现了两种分页:一种采用PagedList.Mvc 实现分页 两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。 功能相对比较简单仅供学习交流。 ...

    有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个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   /// <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分页

     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         }

    View

     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>

    截图

     项目地址:https://github.com/hgmsq/mvcprocpage

    转载于:https://www.cnblogs.com/hgmyz/p/6753050.html

    展开全文
  • 之前写个一个基于Dapper分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现。 代码 还是先上代码:https://github.com/jinweijie/EF.GenericRepository 如何运行示例 还是像先前...
  • 现在遇到个问题,如标题所示:Dapper通用的多表联合分页查询怎么破? 单表的话很简单就可以实现,多表不通用的话也可以很方便的实现,那么如果多表通用的话,怎么办呢? 难道只能通过拼接sql或者使用存储过程吗?...
  • 原文:.NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查、分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL)...
  • 本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查、分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL)。同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要结合业务来实现具体的...
  • 因此研究了一下列表显示时分页实现,这里我使用了bootstrap的样式,所以在页面中引用bootstrap的样式文件,后台提数据源使用.net的,数据库访问使用EF,如果库中存有大量数据,为提高显示速度还是建议使用更好的...
  • 本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查、分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL)。同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要结合业务来实现具体的...
  • 通过实现自定义映射。 重要说明:该库是与Dapper.Contrib( 项目的子系统)分开工作的。 特征 开箱即用的零配置。 自动为获取,插入,更新和删除操作映射POCO。 GetList,Count方法用于更高级的方案。 GetPage...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

dapper实现分页