EF 利用PagedList进行分页并结合查询 方法2

微软提供了PagedList分页,相信大家在网上也能搜索一大堆关于pagedList用法的博客,论坛。但是,在使用的过程中一不小心,就会掉入pagedList某种常规用法的陷阱。

我所说的某种常规用法是指如下方法(也可以参考我的博客:PagedList 分页用法):

代码如下:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Linq;
using EF_Test.DAL;
using System.Data;
using PagedList;

namespace EF_Test.Controllers
{
    public class HomeController : Controller
    {
        private StudentContext db = new StudentContext();
        /// <summary>
        /// 简单分页演示
        /// </summary>
        /// <param name="page">页码</param>
        /// <returns></returns>
        public ActionResult Index2(int page = 1)//查询所有学生数据
        {
            return View(db.Students.OrderBy(item => item.Id).ToPagedList(page, 9));
        }
    }
}

前端HTML

@model PagedList.IPagedList<EF_Test.DAL.Student>
@using PagedList.Mvc
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@section css{
    <link href="~/Content/PagedList.css" rel="stylesheet" />
    <style type="text/css">
        body {
            font-size: 12px;
            font-family: "微软雅黑";
            color: #555;
            position: relative;
            background: #fff;
        }

        a {
            text-decoration: none;
            color: #555;
        }

        #tbList {
            border: 1px solid none;
            width: 800px;
            margin: 10px auto;
            border-collapse: collapse;
        }

            #tbList th, td {
                border: 1px solid #ccc;
                padding: 5px;
                text-align: center;
            }

        tfoot tr td {
            border: none;
        }
    </style>
}

@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
    <div style="text-align: center;">
        <h1>Mvc分页例子</h1>
        <table id="tbList">

            <tbody>
                @if (Model.Count() != 0)
                {
                    <tr>
                        <th>姓名
                        </th>
                        <th>性别
                        </th>
                        <th>学号
                        </th>
                    </tr>
                    foreach (var item in Model)
                    {
                    <tr style="text-align: center;">
                        <td>
                            @Html.DisplayFor(modelItem => item.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Sex)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.StudentNum)
                        </td>
                    </tr>
                    }

                }
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="5">
                        <div class="">
                            @if (Model != null)
                            {
                                <span style="height: 20px; line-height: 20px;">共 @Model.TotalItemCount.ToString() 条记录,当前第 @Model.PageNumber 页/共 @Model.PageCount 页 </span>
                                @Html.PagedListPager(Model, page => Url.Action("Index", new { page }), new PagedListRenderOptions() { LinkToFirstPageFormat = "首页", LinkToNextPageFormat = "下一页", LinkToPreviousPageFormat = "上一页", LinkToLastPageFormat = "末页", DisplayItemSliceAndTotal = false, MaximumPageNumbersToDisplay = 3 })
                            }
                        </div>
                    </td>
                </tr>
            </tfoot>
        </table>
    </div>
}

上述的用法很简单,直接查询所有数据,然后利用pagedList提供的HTML helper 进行分页。

其效果图也不错,如下:

上述中红色字体提到:该用法需要一次性查询表中所有数据,试问:如果您的数据表中有百万甚至千万条数据,那么这种用法效率是不是将会很低?

说来也惭愧,当初用的时候,我也想到了这个弊端,但是一直没去想办法解决这个问题。

还好,pagedList还提供了另外一种方法:StaticPagedList 方法

StaticPagedList 方法需要提供四个参数,分别为:数据源  当前页码  每页条数  以及总记录数

如上述所言,我们在查询的过程中不能一次性查询所有数据,因为这样做效率很低。而现在我们要做的就是查询当前页码的 10 条数据(假设每页展示十条数据)及返回数据表中的总记录数。

那么我们该怎么做呢?

方法其实很多,在我的项目中,我用到一个存储过程<不管你用什么,你现在要做的就是返回:当前页码的 10 条数据,及数据表总记录条数>

我用到的存储过程为:请参考我的上篇博客

有了存储过程,我们就要用EF执行这个存储过程,怎么执行呢?

接口层:

IEnumerable<StudentModel> GetPagePro(string tableName, string fields, string orderField, string sqlWhere, int pageSize, int pageIndex, out int totalPage, out int RecordCount);

执行层:继承接口

        /// <summary>
        /// EF执行存储过程
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="fields">所要查询的字段</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="sqlWhere">条件语句 where</param>
        /// <param name="pageSize">页容量</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="totalPage">out参数 总分页数量</param>
        /// <param name="RecordCount">out 参数 总记录数</param>
        /// <returns></returns>
        public IEnumerable<StudentModel> GetPagePro(string tableName, string fields, string orderField, string sqlWhere, int pageSize, int pageIndex, out int totalPage, out int RecordCount)
         {
            using (StudentEntities context = new StudentEntities())
            {
                SqlParameter[] parameters = {
                    new SqlParameter("@TableName", SqlDbType.NText),
                    new SqlParameter("@Fields", SqlDbType.NText),
                    new SqlParameter("@OrderField", SqlDbType.NText),
                    new SqlParameter("@sqlWhere", SqlDbType.NText),
                    new SqlParameter("@pageSize", SqlDbType.Int),
                    new SqlParameter("@pageIndex", SqlDbType.Int),
                    new SqlParameter("@TotalPage", SqlDbType.Int),
                    new SqlParameter("@RecordCount", SqlDbType.Int)
                    };
                parameters[0].Value = tableName;
                parameters[1].Value = fields;
                parameters[2].Value = orderField;
                parameters[3].Value = sqlWhere;
                parameters[4].Value = pageSize;
                parameters[5].Value = pageIndex;
                parameters[6].Direction = ParameterDirection.Output;
                parameters[7].Direction = ParameterDirection.Output;
                var data = context.Database.SqlQuery<StudentModel>("exec [ZXL_GetPageData] @TableName,@Fields,@OrderField,@sqlWhere,@pageSize,@pageIndex,@TotalPage out,@RecordCount out", parameters).ToList();
                int count = data.Count;
                //
                string n6 = parameters[6].Value.ToString();
                string n7 = parameters[7].Value.ToString();
                //
                totalPage = !string.IsNullOrEmpty(n6) ? int.Parse(n6) : 0;
                RecordCount = !string.IsNullOrEmpty(n7) ? int.Parse(n7) : 0;
                return data;
            }
        }

实体Model层:

    public class StudentModel
    {
        public int Id { get; set; }
        public string StuNum { get; set; }
        public string deptNum { get; set; }
        public string StuName { get; set; }
        public string StuSex { get; set; }
        public Nullable<System.DateTime> AddTime { get; set; }
    }

控制器代码:

        public ActionResult Index(int page=1)//查询所有学生数据
        {
            int totalPage=0;
            int recordCount=0;
            var  data = studentdb.GetPagePro("Student", "*", "Id", "", 10, page, out totalPage, out recordCount);
            var studentList = new StaticPagedList<StudentModel>(data,page,10,recordCount);
            return View(studentList);//
        }

UI/View层

@model PagedList.StaticPagedList<Test.Model.StudentModel>
@using PagedList.Mvc
@using PagedList
@{
    ViewBag.Title = "Index";
    Layout = null;
}
<link href="~/Content/PagedList.css" rel="stylesheet" />
<style type="text/css">
    body {
        font-size: 12px;
        font-family: "微软雅黑";
        color: #555;
        position: relative;
        background: #fff;
    }

    a {
        text-decoration: none;
        color: #555;
    }

    #tbList {
        border: 1px solid none;
        width: 800px;
        margin: 10px auto;
        border-collapse: collapse;
    }

        #tbList th, td {
            border: 1px solid #ccc;
            padding: 5px;
            text-align: center;
        }

    tfoot tr td {
        border: none;
    }
</style>

@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
    <div style="text-align: center;">
        <h1>Mvc分页例子</h1>
        <table id="tbList">
           @* <thead>
                <tr>
                    <th>
                        <input id="StuName" name="StuName" type="text" placeholder="请输入姓名" />
                    </th>
                    <th>
                        <input id="StuNum" name="StuNum" type="text" placeholder="请输入学号" />
                    </th>
                    <th>
                        <input id="Submit1" type="submit" value="submit" />
                    </th>
                </tr>
            </thead>*@

            <tbody>
                @if (Model.Count() != 0)
                {
                    <tr>
                        <th>姓名
                        </th>
                        <th>性别
                        </th>
                        <th>学号
                        </th>
                    </tr>
                    foreach (var item in Model)
                    {
                    <tr style="text-align: center;">
                        <td>
                            @Html.DisplayFor(modelItem => item.StuName)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.StuSex)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.StuNum)
                        </td>
                    </tr>
                    }

                }
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="5">
                        <div class="">
                            @if (Model != null)
                            {
                                <span style="height: 20px; line-height: 20px;">共 @Model.TotalItemCount.ToString() 条记录,当前第 @Model.PageNumber 页/共 @Model.PageCount 页 </span>
                                @Html.PagedListPager(Model, page => Url.Action("Index", new { page }), new PagedListRenderOptions() { LinkToFirstPageFormat = "首页", LinkToNextPageFormat = "下一页", LinkToPreviousPageFormat = "上一页", LinkToLastPageFormat = "末页", DisplayItemSliceAndTotal = false, MaximumPageNumbersToDisplay = 3 })
                            }
                        </div>
                    </td>
                </tr>
            </tfoot>
        </table>
    </div>
}

上述代码已经很齐全了,大家可以自行尝试,需要说明两点:

控制器代码:

view层HTML代码:

至此,整个pagedList分页就完毕了。

这样查询提升了效率。

我的分页效果图如下:

由图可知,我的数据表共有:151303条记录,如果采用每次都加载所有数据,效率是何其低可想而知。

呵呵,截止到这儿,pagedlist分页也就讲完了!

现在,我们提出新的要求:结合查询,根据学生姓名和学号进行模糊查询

其后端变更如下:

        public ActionResult Index(int page = 1, string StuName = "", string StuNum = "",string sortOrder="")//查询所有学生数据
        {
            string where = string.Empty;
            if (!string.IsNullOrEmpty(StuName))
            {
                ViewBag.StuName = StuName;
                where += " and StuName like ‘%" + StuName + "%‘";
            }
            if (!string.IsNullOrEmpty(StuNum))
            {
                ViewBag.StuNum = StuNum;
                where += " and StuNum like ‘%" + StuNum + "%‘";
            }
            int totalPage = 0;
            int recordCount = 0;
            var data = model.GetPagePro("Student", "*", "Id", " 1=1 " + where, 10, page, out totalPage, out recordCount);

            var studentList = new StaticPagedList<StudentModel>(data, page, 10, recordCount);
            return View(studentList);//
        }

前端如下:

@model PagedList.StaticPagedList<Test.Model.StudentModel>
@using PagedList.Mvc
@using PagedList
@{
    ViewBag.Title = "Index";
    Layout = null;
}
<link href="~/Content/PagedList.css" rel="stylesheet" />
<style type="text/css">
    body {
        font-size: 12px;
        font-family: "微软雅黑";
        color: #555;
        position: relative;
        background: #fff;
    }

    a {
        text-decoration: none;
        color: #555;
    }

    #tbList {
        border: 1px solid none;
        width: 800px;
        margin: 10px auto;
        border-collapse: collapse;
    }

        #tbList th, td {
            border: 1px solid #ccc;
            padding: 5px;
            text-align: center;
        }

    tfoot tr td {
        border: none;
    }
</style>

@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
    <div style="text-align: center;">
        <h1>Mvc分页例子</h1>
        <table id="tbList">
            <thead>
                <tr>
                    <th>
                        <input id="StuName" name="StuName" type="text" placeholder="请输入姓名" value="@ViewBag.StuName" />
                    </th>
                    <th>
                        <input id="StuNum" name="StuNum" type="text" placeholder="请输入学号" value="@ViewBag.StuNum" />
                    </th>
                    <th>
                        <input id="Submit1" type="submit" value="submit" />
                    </th>
                </tr>
            </thead>

            <tbody>
                @if (Model.Count() != 0)
                {
                    <tr>
                        <th>姓名
                        </th>
                        <th>性别
                        </th>
                        <th>学号
                        </th>
                    </tr>
                    foreach (var item in Model)
                    {
                    <tr style="text-align: center;">
                        <td>
                            @Html.DisplayFor(modelItem => item.StuName)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.StuSex)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.StuNum)
                        </td>
                    </tr>
                    }

                }
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="5">
                        <div class="">
                            @if (Model != null)
                            {
                                <span style="height: 20px; line-height: 20px;">共 @Model.TotalItemCount.ToString() 条记录,当前第 @Model.PageNumber 页/共 @Model.PageCount 页 </span>
                                @Html.PagedListPager(Model, page => Url.Action("Index", new { page,StuName=ViewBag.StuName,StuNum=ViewBag.StuNum }), new PagedListRenderOptions() { LinkToFirstPageFormat = "首页", LinkToNextPageFormat = "下一页", LinkToPreviousPageFormat = "上一页", LinkToLastPageFormat = "末页", DisplayItemSliceAndTotal = false, MaximumPageNumbersToDisplay = 3 })
                            }
                        </div>
                    </td>
                </tr>
            </tfoot>
        </table>
    </div>
}

上图为变更处、

运行效果:

原文地址:https://www.cnblogs.com/webenh/p/11648159.html

时间: 2024-11-10 18:55:33

EF 利用PagedList进行分页并结合查询 方法2的相关文章

ASP.NET MVC利用PagedList分页(一)

前几天看见博客园上有人写ASP.NET MVC的分页思想,这让我不禁想起了PagedList.PagedList是NuGet上提供的一个分页的类库,能对任何IEnumerable<T>进行分页,而且非常简单好用.从NuGet上,可以获取两个DLL:PagedList.dll和PagedList.Mvc.dll.PagedList.dll提供分页的核心操作,PagedList.Mvc.dll是一个辅助类库,在创建分页的UI时候提供简单.可扩展的创建方法.不过PagedList.dll可以用于MV

ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender

(原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人绝对局部刷新更准确 些)的分页.其实在PagedList.Mvc中早已经为我们提供好了Ajax分页的各种东东,但是这里我要自己写下. 实现思想: 1.客户端发送Ajax请求.2.服务器端响应请求并将响应结果回传给客户端.3.客户端接收响应结果并进行数据绑定. 实现方案: 大多数人都知道这个思想,但是

[DB][MyBatis]利用mybatis-paginator实现分页(目前看到MyBatis下最好的分页实现)

利用mybatis-paginator实现分页 1.mybatis-paginator简介 mybatis-paginator是gethub上的一个开源项目.用于java后台获取分页数据.该开源项目还提供一个列表组件(mmgrid)用于前端展示. 该开源项目地址:https://github.com/miemiedev 2.该开源项目的使用说明: Maven中加入依赖: <dependencies> ... <dependency> <groupId>com.githu

利用SqlDataAdapter进行分页

利用SqlDataAdapter进行记录分页 说到分页,很多地方都会用到,不管是windows程序还是web程序,为什么要进行分页?很简单,如果BlueIdea BBS帖子列表不分页的话,几十万条记录,可想而知....... 分页有几种方法,可以用存储过程进行分页,将要显示的记录写入一个临时表中,再从临时表中取出这些记录,取出的记录呢,也就是当前页的记录了.我这里谈到的,是利用SqlDataAdapter Fill方法的重载,进行分页 public int Fill (    DataSet d

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

PagedList.MVC分页

? 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

thinkphp分页时保持查询条件

thinkphp 查询数据时需要分页显示时,会出现只有第1页是按查询条件查到的数据,而其他页面都恢复了,我们想要的结果却是:在翻页时,查询条件保持不变. 原因是:在分页跳转的时候,没有将查询条件作为分页参数传递到下一页.原来翻页的时候,存储在REQUEST变量中的参数并未被传递到下一页,因为表单的 method = “post”,而点击进入下一页时,很明显form表单被重置了,所以打印REQUEST变量也是空的. thinkphp RBAC的示例代码中给出了: PHP $p = new Page

jdbc案例_分页_条件查询

客户信息增删改查系统 软件工程开发流程:1.瀑布模型 2.螺旋模型 RUP (Rational Unified Process,统一软件开发过程 ) 采用瀑布模型: 需求 --- 需求分析 --- 系统设计(概要.详细设计)---- 编码 --- 测试 --- 实施 --- 维护 * 瀑布模型 缺陷在编码结束之前,客户看不到最终软件产品 ,如果需求.设计出现明显错漏,导致软件后期无法维护,存在重大缺陷 * 瀑布模型对于 新型软件,需求不定软件 风险较大 敏捷开发理念:迭代开发模式 ,将系统功能分