<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MongoDB學習筆記~為IMongoRepository接口添加分頁取集合的方法

      回到目錄

      對于數據分頁,我們已經見的太多了,幾乎每個列表頁面都要用到分頁,這已經成了一種定理了,在進行大數據展示時,如果不去分頁,而直接把數據加載到內存,這簡直是不可以去相向的,呵呵,在很多ORM工具中都對分頁有了更好的支持,如LINQ里有大家熟悉的take和skip,而在MongoDB里也有這種概念,它使用limit和skip實現,這在大多數的Mongo客戶端上都集成了這個功能,即幫助我們組合命令參數,并帶我們把分頁取數據的指令發到Mongo服務器去,實現分頁技術!

      添加了分頁后的IMongoRepository接口

              /// <summary>
              /// MongoDB集成的查詢方法,大數據情況下,有分頁時使用這個方法
              /// </summary>
              /// <typeparam name="U">匿名對象,用來為條件賦值</typeparam>
              /// <param name="template">條件對象</param>
              /// <param name="limit"></param>
              /// <param name="skip"></param>
              /// <returns></returns>
              PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize);
              /// <summary>
              /// MongoDB集成的查詢方法,大數據情況下,有分頁和排序時使用這個方法
              /// </summary>
              /// <typeparam name="U">匿名對象,用來為條件賦值</typeparam>
              /// <typeparam name="O">匿名對象,用來為排序賦值,NoRM.OrderBy枚舉</typeparam>
              /// <param name="template">條件對象</param>
              /// <param name="orderby">排序對象</param>
              /// <param name="limit"></param>
              /// <param name="skip"></param>
              /// <returns></returns>
              PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize);

      看我是如何去實現它的,事實上是調用了Mongo客戶端封裝的Find<T, U, O>(this IMongoCollection<T> collection, U template, O orderby, int limit, int skip);方法

      實現的,我們來看一下代碼

        public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize)
              {
                  var skip = (pageIndex - 1) * pageSize;
                  var limit = pageSize;
                  var recordCount = _table.Count();
                  return new PagedResult<TEntity>(
                      recordCount,
                      (int)(recordCount + pageSize - 1) / pageSize,
                      pageSize,
                      pageIndex,
                      _table.Find(template, orderby, limit, skip).ToList());
              }

      代碼主要實現的是分頁和排序功能,其中template是查詢條件,可以傳入一個匿名對象,而orderby參數表示一個排序的匿名對象,把排序字段寫到對象里即可,升序為1,降

      序為-1,也可以使用它定義好的枚舉來賦值,下面我們為上面方法做一個重載,來針對不需要排序的需求

         public PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize)
              {
                  return GetModel(template, new { }, pageIndex, pageSize);
              }

      有了底層的方法,再來看它的返回值,如果是分頁返回對象,那么一定要返回一個PagedResult泛型對象,這個對象主要向外部公開一個參數,如當前頁的數據集,當前頁號

      每面顯示記錄數,總頁數和總的記錄數及URL條件集合等。

          /// <summary>
          /// 分頁結果對象,UI顯示它,BLL為它賦值
          /// 陳晴陽開發,張占嶺修改,添加了AddParameters屬性,用來存儲URL參數
          /// </summary>
          /// <typeparam name="T"></typeparam>
          public class PagedResult<T> : IEnumerable<T>, ICollection<T>
          {
              #region Public Fields
              /// <summary>
              /// 獲取一個當前類型的空值。
              /// </summary>
              public static readonly PagedResult<T> Empty = new PagedResult<T>(0, 0, 0, 0, null);
              #endregion
      
              #region Ctor
              /// <summary>
              /// 初始化一個新的<c>PagedResult{T}</c>類型的實例。
              /// </summary>
              public PagedResult()
              {
                  Data = new List<T>();
                  AddParameters = new NameValueCollection();
                  PageSize = 10;
              }
              /// <summary>
              /// 初始化一個新的<c>PagedResult{T}</c>類型的實例。
              /// </summary>
              /// <param name="totalRecords">總記錄數。</param>
              /// <param name="totalPages">頁數。</param>
              /// <param name="pageSize">頁面大小。</param>
              /// <param name="pageNumber">頁碼。</param>
              /// <param name="data">當前頁面的數據。</param>
              public PagedResult(long totalRecords, int totalPages, int pageSize, int pageNumber, List<T> data)
              {
                  this.TotalPages = totalPages;
                  this.TotalRecords = totalRecords;
                  this.PageSize = pageSize;
                  this.PageIndex = pageNumber;
                  this.Data = data;
              }
              #endregion
      
              #region Public Properties
              /// <summary>
              /// 獲取或設置總記錄數。
              /// </summary>
              public long TotalRecords { get; set; }
              /// <summary>
              /// 獲取或設置頁數。
              /// </summary>
              public int TotalPages { get; set; }
              /// <summary>
              /// 獲取或設置頁面大小。
              /// </summary>
              public int PageSize { get; set; }
              /// <summary>
              /// 獲取或設置頁碼。
              /// </summary>
              public int PageIndex { get; set; }
              /// <summary>
              /// 獲取或設置當前頁面的數據。
              /// </summary>
              public List<T> Data { get; set; }
              /// <summary>
              /// 分頁參數
              /// </summary>
              public NameValueCollection AddParameters { get; set; }
              #endregion
      
              #region Public Methods
              /// <summary>
              /// 確定指定的Object是否等于當前的Object。
              /// </summary>
              /// <param name="obj">要與當前對象進行比較的對象。</param>
              /// <returns>如果指定的Object與當前Object相等,則返回true,否則返回false。</returns>
              /// <remarks>有關此函數的更多信息,請參見:http://msdn.microsoft.com/zh-cn/library/system.object.equals/// </remarks>
              public override bool Equals(object obj)
              {
                  if (ReferenceEquals(this, obj))
                      return true;
                  if (obj == (object)null)
                      return false;
                  var other = obj as PagedResult<T>;
                  if (other == (object)null)
                      return false;
                  return this.TotalPages == other.TotalPages &&
                      this.TotalRecords == other.TotalRecords &&
                      this.PageIndex == other.PageIndex &&
                      this.PageSize == other.PageSize &&
                      this.Data == other.Data;
              }
      
              /// <summary>
              /// 用作特定類型的哈希函數。
              /// </summary>
              /// <returns>當前Object的哈希代碼。</returns>
              /// <remarks>有關此函數的更多信息,請參見:http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode/// </remarks>
              public override int GetHashCode()
              {
                  return this.TotalPages.GetHashCode() ^
                      this.TotalRecords.GetHashCode() ^
                      this.PageIndex.GetHashCode() ^
                      this.PageSize.GetHashCode();
              }
      
              /// <summary>
              /// 確定兩個對象是否相等。
              /// </summary>
              /// <param name="a">待確定的第一個對象。</param>
              /// <param name="b">待確定的另一個對象。</param>
              /// <returns>如果兩者相等,則返回true,否則返回false。</returns>
              public static bool operator ==(PagedResult<T> a, PagedResult<T> b)
              {
                  if (ReferenceEquals(a, b))
                      return true;
                  if ((object)a == null || (object)b == null)
                      return false;
                  return a.Equals(b);
              }
      
              /// <summary>
              /// 確定兩個對象是否不相等。
              /// </summary>
              /// <param name="a">待確定的第一個對象。</param>
              /// <param name="b">待確定的另一個對象。</param>
              /// <returns>如果兩者不相等,則返回true,否則返回false。</returns>
              public static bool operator !=(PagedResult<T> a, PagedResult<T> b)
              {
                  return !(a == b);
              }
              #endregion
      
              #region IEnumerable<T> Members
              /// <summary>
              /// 返回一個循環訪問集合的枚舉數。
              /// </summary>
              /// <returns>一個可用于循環訪問集合的 IEnumerator 對象。</returns>
              public IEnumerator<T> GetEnumerator()
              {
                  return Data.GetEnumerator();
              }
      
              #endregion
      
              #region IEnumerable Members
              /// <summary>
              /// 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
              /// </summary>
              /// <returns>一個可用于循環訪問集合的 IEnumerator 對象。</returns>
              IEnumerator IEnumerable.GetEnumerator()
              {
                  return Data.GetEnumerator();
              }
      
              #endregion
      
              #region ICollection<T> Members
              /// <summary>
              /// 將某項添加到 ICollection{T} 中。
              /// </summary>
              /// <param name="item">要添加到 ICollection{T} 的對象。</param>
              public void Add(T item)
              {
                  Data.Add(item);
              }
      
              /// <summary>
              /// 從 ICollection{T} 中移除所有項。
              /// </summary>
              public void Clear()
              {
                  Data.Clear();
              }
      
              /// <summary>
              /// 確定 ICollection{T} 是否包含特定值。
              /// </summary>
              /// <param name="item">要在 ICollection{T} 中定位的對象。</param>
              /// <returns>如果在 ICollection{T} 中找到 item,則為 true;否則為 false。</returns>
              public bool Contains(T item)
              {
                  return Data.Contains(item);
              }
      
              /// <summary>
              /// 從特定的 Array 索引開始,將 ICollection{T} 的元素復制到一個 Array 中。
              /// </summary>
              /// <param name="array">作為從 ICollection{T} 復制的元素的目標的一維 Array。 Array 必須具有從零開始的索引。</param>
              /// <param name="arrayIndex">array 中從零開始的索引,從此索引處開始進行復制。</param>
              public void CopyTo(T[] array, int arrayIndex)
              {
                  Data.CopyTo(array, arrayIndex);
              }
      
              /// <summary>
              /// 獲取 ICollection{T} 中包含的元素數。
              /// </summary>
              public int Count
              {
                  get { return Data.Count; }
              }
      
              /// <summary>
              /// 獲取一個值,該值指示 ICollection{T} 是否為只讀。
              /// </summary>
              public bool IsReadOnly
              {
                  get { return false; }
              }
      
              /// <summary>
              /// 從 ICollection{T} 中移除特定對象的第一個匹配項。
              /// </summary>
              /// <param name="item">要從 ICollection{T} 中移除的對象。</param>
              /// <returns>如果已從 ICollection{T} 中成功移除 item,則為 true;否則為 false。 如果在原始 ICollection{T} 中沒有找到 item,該方法也會返回 false。 </returns>
              public bool Remove(T item)
              {
                  return Data.Remove(item);
              }
      
              #endregion
          }

      有了底層方法和返回的對象,下面就是前臺顯示了,我們可以擴展一個PagerHelper,重新為它起個名字叫PagedResultHelper吧,把它的相關PagedList類型對象修改成PagedResult對象即可,代碼如下

        /// <summary>
          /// 關于PagedResult對象的分頁展示
          /// 作者:張占嶺,花名:倉儲大叔
          /// </summary>
          public static class PagedResultHelper
          {
      
              #region Ajax分頁
              /// <summary>
              /// AJAX分頁
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="html"></param>
              /// <param name="pagedList"></param>
              /// <param name="UpdateTargetId"></param>
              /// <returns></returns>
              public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, bool isDisplayCompletePage)
              {
                  var ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), UpdateTargetId, pagedList.AddParameters);
                  if (!isDisplayCompletePage)
                      return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, false));
                  else
                      return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords));
              }
      
              public static MvcHtmlString AjaxPager<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId)
              {
                  return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, true);
              }
              /// <summary>
              /// AJAX分頁
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="html"></param>
              /// <param name="pagedList"></param>
              /// <param name="UpdateTargetId"></param>
              /// <param name="ActionName"></param>
              /// <param name="ControllerName"></param>
              /// <returns></returns>
              public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage, bool isTop)
              {
                  var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占嶺修改
                  var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
                  var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
                  var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters);
                  return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isDisplayCompletePage, false, isTop));
              }
              public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage)
              {
                  return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, ActionName, ControllerName, true, false);
              }
              /// <summary>
              /// ajax方式,MVC路由支持的分頁
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="html"></param>
              /// <param name="pagedList"></param>
              /// <param name="UpdateTargetId"></param>
              /// <param name="ActionName"></param>
              /// <param name="ControllerName"></param>
              /// <returns></returns>
              public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName)
              {
                  var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占嶺修改
                  var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
                  var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
                  var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters);
      
                  return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
                     , pagedList.PageSize
                     , (int)pagedList.TotalRecords
                     , 0
                     , new UrlHelper(html.ViewContext.RequestContext)
                     , html.ViewContext.RouteData.Values["action"].ToString()
                     , html.ViewContext.RouteData.Values["controller"].ToString(), true, false, null));
      
              }
             
              #endregion
      
              #region Html分頁
              /// <summary>
              /// Html分頁,不使用MVC路由
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="html"></param>
              /// <param name="pagedList"></param>
              /// <returns></returns>
              public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList)
              {
                  return PagerResult<T>(html, pagedList, false);
              }
              public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string className)
              {
                  return PagerResult<T>(html, pagedList, false, className);
              }
              public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, string className)
              {
                  return PagerResult<T>(html, pagedList, router, true, className);
              }
              /// <summary>
              /// Html分頁,router為true表示走MVC路由
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="html"></param>
              /// <param name="pagedList"></param>
              /// <param name="router">路由</param>
              /// <param name="className">CSS類名</param>
              /// <returns></returns>
              public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, bool isCompleteDisplay, string className)
              {
                  if (pagedList == null)
                      return null;
                  UIHelper ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), pagedList.AddParameters);
                  if (router)
                      return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
                          , pagedList.PageSize
                          , (int)pagedList.TotalRecords
                          , 0
                          , new UrlHelper(html.ViewContext.RequestContext)
                          , html.ViewContext.RouteData.Values["action"].ToString()
                          , html.ViewContext.RouteData.Values["controller"].ToString(), isCompleteDisplay, false, className));
                  return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isCompleteDisplay, className));
              }
              public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router)
              {
                  return PagerResult<T>(html, pagedList, router, null);
              }
              #endregion
      
          }

      這樣,我們前臺調用分頁時,還是一句話就搞定了,呵呵!

      事實上,對于PagedResult我們也可以用在其它ORM工具上,因為一定的數據庫和NoSql都開放了limit及skip等功能,大家可以放眼去看,放心去想,呵呵!

      回到目錄

      posted @ 2015-04-11 22:13  張占嶺  閱讀(8796)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品SM捆绑调教视频| 性视频一区| 中文文字幕文字幕亚洲色| 免费av深夜在线观看| 亚洲中文字幕无码一久久区| 免费a级毛片无码av| 久久综合综合久久高清免费| 国产一区二区高清不卡| 人人澡人人透人人爽| 国产精品一二二区视在线| 亚洲乱熟乱熟女一区二区| 亚洲精品久久婷婷丁香51| 成人免费A级毛片无码片2022 | 久久精品国产亚洲av亚| 四房播色综合久久婷婷| 午夜福利一区二区三区在线观看| 久久蜜臀av一区三区| 永久免费AV无码网站YY| 亚洲午夜香蕉久久精品| 国产一区二区爽爽爽视频| 国产精品XXXX国产喷水| 最近中文字幕免费手机版| 国产片一区二区三区视频| 国产成人亚洲欧美二区综合| 临西县| 亚洲欧美综合精品成人网站| 精品国产亚洲一区二区三区| yw尤物av无码国产在线观看| 无码精品国产va在线观看| 国产黄色一级片在线观看| 久久一区二区中文字幕| 国产综合色在线精品| 浴室人妻的情欲hd三级国产| 香蕉乱码成人久久天堂爱| 亚洲欧美综合精品成| 贡山| 欧美和黑人xxxx猛交视频| 国产一区二区亚洲一区二区三区| 人妻中文字幕精品系列| 性色在线视频精品| 少妇被粗大的猛烈进出视频|