中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Lind.DDD.Paging分頁模塊介紹

回到目錄

分頁(ye)(ye)(ye)(ye)(ye)組(zu)件網上有很多(duo),MVC.Pager,JSPager等,通過實現方(fang)式大體分為前(qian)(qian)端(duan)分頁(ye)(ye)(ye)(ye)(ye)和(he)后(hou)端(duan)分頁(ye)(ye)(ye)(ye)(ye),前(qian)(qian)端(duan)分頁(ye)(ye)(ye)(ye)(ye)是(shi)前(qian)(qian)臺對list內(nei)(nei)存本地(di)集(ji)合(he)進行分頁(ye)(ye)(ye)(ye)(ye),缺點就(jiu)是(shi)在大數據(ju)情(qing)況下(xia),內(nei)(nei)存占(zhan)用(yong)過高;后(hou)端(duan)分頁(ye)(ye)(ye)(ye)(ye)就(jiu)是(shi)UI把(ba)(ba)要返(fan)回(hui)的(de)頁(ye)(ye)(ye)(ye)(ye)號告訴后(hou)臺,由后(hou)臺組(zu)織數據(ju)并返(fan)回(hui),這種方(fang)法就(jiu)是(shi)我們經常看到(dao)的(de)了(le);而(er)根據(ju)后(hou)臺集(ji)合(he)種類又可以分類List和(he)IQueryable,前(qian)(qian)者(zhe)是(shi)本地(di)集(ji)合(he),在返(fan)回(hui)數據(ju)時,直接把(ba)(ba)第幾頁(ye)(ye)(ye)(ye)(ye)共幾條的(de)集(ji)合(he)返(fan)回(hui);IQueryable是(shi)預查詢集(ji)合(he),它(ta)是(shi)Linq的(de)產物,在很多(duo)地(di)里它(ta)不(bu)通用(yong),除非你的(de)ORM框架支(zhi)持(chi)Linq,否則建議用(yong)List本地(di)集(ji)合(he),一(yi)般來說,分頁(ye)(ye)(ye)(ye)(ye)的(de)本地(di)集(ji)合(he)會在底層提供一(yi)些方(fang)法,它(ta)的(de)參數一(yi)般包(bao)含(han)了(le)pageIndex和(he)pageSize,下(xia)面可以看一(yi)下(xia)大叔(shu)針對mongodb制定的(de)分頁(ye)(ye)(ye)(ye)(ye)規范

      /// <summary>
        /// MongoDB集成的(de)查詢(xun)方法,大數據情況下(xia),有分頁時(shi)使用這個方法
        /// </summary>
        /// <typeparam name="U">匿名(ming)對象,用來為條(tiao)件賦值</typeparam>
        /// <param name="template">條件對象(xiang)</param>
        /// <param name="limit"></param>
        /// <param name="skip"></param>
        /// <returns></returns>
        PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize);

而(er)在Linq的(de)底層(ceng),可以直接(jie)返回IQueryable集合,而(er)在業務(wu)層(ceng)進行返回Lind.DDD.Paging的(de)分(fen)頁集合即可,這塊比較方(fang)便,今天主(zhu)要(yao)說的(de)是(shi)Linq下的(de)分(fen)頁方(fang)法

     /// <summary>
        /// 拿到可(ke)查(cha)詢結果集(Linq)
        /// </summary>
        /// <returns></returns>
        System.Linq.IQueryable<TEntity> GetModel();

LINQ環(huan)境下大叔分頁的(de)介紹

分頁基類

 public abstract class PageListBase<T> : 
        List<T>, 
        IEnumerable<T>, 
        IPagedList //繼承List<T>可以(yi)使用(yong)它(ta)的(de)內部方法,如AddRange,Skip,Take等
    {
        /// <summary>
        /// 初(chu)始化分頁
        /// </summary>
        public PageListBase()
        {
            this.AddParameters = new NameValueCollection();
            this.PageSize = 10;
        }

        /// <summary>
        /// 總頁數
        /// </summary>
        public int TotalPages { get; set; }

        /// <summary>
        /// 總記錄(lu)數
        /// </summary>
        public int TotalCount { get; set; }

        /// <summary>
        /// 當前(qian)頁
        /// </summary>
        public int PageIndex { get; set; }

        /// <summary>
        /// 每頁顯示多少(shao)條記錄(lu)
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 是否(fou)有上一頁
        /// </summary>
        public bool IsPreviousPage { get { return (PageIndex > 0); } }

        /// <summary>
        /// 是(shi)否(fou)有(you)下一頁
        /// </summary>
        public bool IsNextPage { get { return (PageIndex * PageSize) <= TotalCount; } }

        /// <summary>
        /// 分頁參數(shu)
        /// </summary>
        public NameValueCollection AddParameters { get; set; }
    }

對(dui)于分(fen)頁(ye)我們(men)提供了傳(chuan)統分(fen)頁(ye)和微博式(加載更多)分(fen)頁(ye),它們(men)有自己的返回對(dui)象,看一(yi)下代碼

    /// <summary>
    /// 分頁(ye)通用類(傳統分頁(ye))
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PagedList<T> : PageListBase<T>
    {
        public PagedList()
            : this(null, 0, 0)
        {
        }
        /// <summary>
        /// 數據源為IQueryable的范型(xing)
        /// </summary>
        /// <param name="source">數據源</param>
        /// <param name="index">當(dang)前頁</param>
        /// <param name="pageSize">每(mei)頁顯示多少條記錄(lu)</param>
        public PagedList(IQueryable<T> source, int index, int pageSize)
        {
            if (source != null) //判(pan)斷傳(chuan)過(guo)來的實體集(ji)是否(fou)為空
            {
                int total = source.Count();
                this.TotalCount = total;
                this.TotalPages = total / pageSize;

                if (total % pageSize > 0)
                    TotalPages++;

                this.PageSize = pageSize;
                if (index > this.TotalPages)
                {
                    index = this.TotalPages;
                }
                if (index < 1)
                {
                    index = 1;
                }
                this.PageIndex = index;
                this.AddRange(source.Skip((index - 1) * pageSize).Take(pageSize).ToList()); //Skip是跳到(dao)第幾(ji)頁(ye),Take返(fan)回多少條
            }
        }
    }

微博式分頁主要是在原有(you)數據基礎上(shang),進(jin)行(xing)追(zhui)加數據,這在Linq里相當于一(yi)個Skip(0)加Take(PageIndex*PageSize)的動作,呵呵

    /// <summary>
    /// 以追加的方式,顯示內容,即從第1頁開始顯示N條記錄(lu)
    /// </summary>
    /// <typeparam name="T"></typeparam>
     public class PageListAppend<T> : PageListBase<T>
    {
        /// <summary>
        /// 數據源為IQueryable的范(fan)型
        /// </summary>
        /// <param name="source">數(shu)據(ju)源</param>
        /// <param name="index">當前頁</param>
        /// <param name="pageSize">每頁顯示多少條記錄</param>
        public PageListAppend(IQueryable<T> source, int index, int pageSize)
        {
            if (source != null) //判斷傳過來的實體集是(shi)否為(wei)空
            {
                int total = source.Count();
                this.TotalCount = total;
                this.TotalPages = total / pageSize;

                if (total % pageSize > 0)
                    TotalPages++;

                this.PageSize = pageSize;
                if (index > this.TotalPages)
                {
                    index = this.TotalPages;
                }
                if (index < 1)
                {
                    index = 1;
                }
                this.PageIndex = index;
                this.AddRange(source.Skip(0).Take(index * pageSize).ToList()); //Skip是跳(tiao)到第幾頁(ye),Take返回多少條
            }
        }
    }

有一點要特別注意(yi)一下(xia),在(zai)LINQ分(fen)頁(ye)(ye)時,我們看到被傳入(ru)的集合一定是(shi)IQueryable的,如果是(shi)本(ben)地(di)IList集合,那就失去了分(fen)頁(ye)(ye)的意(yi)義,它相當(dang)于把(ba)所有數據加載到內存(cun),然后再分(fen)頁(ye)(ye)了。

有(you)了數據的(de)返(fan)回,下面再來看一下前臺(tai)頁(ye)面的(de)組織,我們也(ye)封裝了一個(ge)PagerHelper的(de)方法,當(dang)然你也(ye)可以在分部頁(ye)上進行設計(ji),這(zhe)都是可以的(de)。

我(wo)們(men)在(zai)前(qian)臺(tai)調(diao)用(yong)時為大(da)家封(feng)裝了ajax分(fen)(fen)頁(ye)(ye),傳(chuan)統分(fen)(fen)頁(ye)(ye)和微博分(fen)(fen)頁(ye)(ye)等,直接在(zai)view上調(diao)用(yong)即(ji)可(ke),當(dang)然如果你(ni)在(zai)前(qian)臺(tai)對樣式要求比(bi)較嚴格,也(ye)可(ke)以自己設計(ji)分(fen)(fen)布頁(ye)(ye)來(lai)實現

@{
    //分頁靈活視圖,根(gen)據(ju)自己項目的(de)需要,去重(zhong)寫它(ta)
    Layout = null;
    var route = Request.RequestContext.RouteData.Values;
    var controller = route["controller"].ToString();
    var action = route["action"].ToString();
    var currentPage = int.Parse((route["page"] ?? Request.QueryString["page"] ?? "1").ToString());

    var pageCount = int.Parse((route["pageCount"] ?? Request.QueryString["pageCount"] ?? "1").ToString());
    if (currentPage < 1)
    {
        currentPage = 1;
    }
    if (currentPage > pageCount)
    {
        currentPage = pageCount;
    }
}
<div>
    <span>@Html.ActionLink("首頁(ye)", action, controller, new { page = 1 })</span>
    <span>@Html.ActionLink("上(shang)一頁", "Index", new { page = currentPage - 1 })</span>
    <span>@Html.ActionLink("下一(yi)頁", "Index", new { page = currentPage + 1 })</span>
    <span>@Html.ActionLink("尾頁", "Index", new { page = pageCount })</span>
    <span>@currentPage/@pageCount</span>
</div>

感謝各位的耐(nai)心閱讀(du)!

回到目錄

 

posted @ 2016-02-03 09:30  張占嶺  閱讀(1945)  評論(0)    收藏  舉報