日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法

發(fā)布時(shí)間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

回到目錄

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

添加了分頁后的IMongoRepository接口

/// <summary>/// MongoDB集成的查詢方法,大數(shù)據(jù)情況下,有分頁時(shí)使用這個(gè)方法/// </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集成的查詢方法,大數(shù)據(jù)情況下,有分頁和排序時(shí)使用這個(gè)方法/// </summary>/// <typeparam name="U">匿名對象,用來為條件賦值</typeparam>/// <typeparam name="O">匿名對象,用來為排序賦值,NoRM.OrderBy枚舉</typeparam>/// <param name="template">條件對象</param>/// <param name="orderby">排序?qū)ο?/span></param>/// <param name="limit"></param>/// <param name="skip"></param>/// <returns></returns>PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize);

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

實(shí)現(xiàn)的,我們來看一下代碼

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());}

代碼主要實(shí)現(xiàn)的是分頁和排序功能,其中template是查詢條件,可以傳入一個(gè)匿名對象,而orderby參數(shù)表示一個(gè)排序的匿名對象,把排序字段寫到對象里即可,升序?yàn)?,降

序?yàn)?1,也可以使用它定義好的枚舉來賦值,下面我們?yōu)樯厦娣椒ㄗ鲆粋€(gè)重載,來針對不需要排序的需求

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

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

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

/// <summary>/// 分頁結(jié)果對象,UI顯示它,BLL為它賦值/// 陳晴陽開發(fā),張占嶺修改,添加了AddParameters屬性,用來存儲URL參數(shù)/// </summary>/// <typeparam name="T"></typeparam>public class PagedResult<T> : IEnumerable<T>, ICollection<T>{#region Public Fields/// <summary>/// 獲取一個(gè)當(dāng)前類型的空值。/// </summary>public static readonly PagedResult<T> Empty = new PagedResult<T>(0, 0, 0, 0, null);#endregion#region Ctor/// <summary>/// 初始化一個(gè)新的<c>PagedResult{T}</c>類型的實(shí)例。/// </summary>public PagedResult(){Data = new List<T>();AddParameters = new NameValueCollection();PageSize = 10;}/// <summary>/// 初始化一個(gè)新的<c>PagedResult{T}</c>類型的實(shí)例。/// </summary>/// <param name="totalRecords">總記錄數(shù)。</param>/// <param name="totalPages">頁數(shù)。</param>/// <param name="pageSize">頁面大小。</param>/// <param name="pageNumber">頁碼。</param>/// <param name="data">當(dāng)前頁面的數(shù)據(jù)。</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>/// 獲取或設(shè)置總記錄數(shù)。/// </summary>public long TotalRecords { get; set; }/// <summary>/// 獲取或設(shè)置頁數(shù)。/// </summary>public int TotalPages { get; set; }/// <summary>/// 獲取或設(shè)置頁面大小。/// </summary>public int PageSize { get; set; }/// <summary>/// 獲取或設(shè)置頁碼。/// </summary>public int PageIndex { get; set; }/// <summary>/// 獲取或設(shè)置當(dāng)前頁面的數(shù)據(jù)。/// </summary>public List<T> Data { get; set; }/// <summary>/// 分頁參數(shù)/// </summary>public NameValueCollection AddParameters { get; set; }#endregion#region Public Methods/// <summary>/// 確定指定的Object是否等于當(dāng)前的Object。/// </summary>/// <param name="obj">要與當(dāng)前對象進(jìn)行比較的對象。</param>/// <returns>如果指定的Object與當(dāng)前Object相等,則返回true,否則返回false。</returns>/// <remarks>有關(guān)此函數(shù)的更多信息,請參見: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>/// 用作特定類型的哈希函數(shù)。/// </summary>/// <returns>當(dāng)前Object的哈希代碼。</returns>/// <remarks>有關(guān)此函數(shù)的更多信息,請參見: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>/// 確定兩個(gè)對象是否相等。/// </summary>/// <param name="a">待確定的第一個(gè)對象。</param>/// <param name="b">待確定的另一個(gè)對象。</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>/// 確定兩個(gè)對象是否不相等。/// </summary>/// <param name="a">待確定的第一個(gè)對象。</param>/// <param name="b">待確定的另一個(gè)對象。</param>/// <returns>如果兩者不相等,則返回true,否則返回false。</returns>public static bool operator !=(PagedResult<T> a, PagedResult<T> b){return !(a == b);}#endregion#region IEnumerable<T> Members/// <summary>/// 返回一個(gè)循環(huán)訪問集合的枚舉數(shù)。/// </summary>/// <returns>一個(gè)可用于循環(huán)訪問集合的 IEnumerator 對象。</returns>public IEnumerator<T> GetEnumerator(){return Data.GetEnumerator();}#endregion#region IEnumerable Members/// <summary>/// 返回一個(gè)循環(huán)訪問集合的枚舉數(shù)。 (繼承自 IEnumerable。)/// </summary>/// <returns>一個(gè)可用于循環(huán)訪問集合的 IEnumerator 對象。</returns> IEnumerator IEnumerable.GetEnumerator(){return Data.GetEnumerator();}#endregion#region ICollection<T> Members/// <summary>/// 將某項(xiàng)添加到 ICollection{T} 中。/// </summary>/// <param name="item">要添加到 ICollection{T} 的對象。</param>public void Add(T item){Data.Add(item);}/// <summary>/// 從 ICollection{T} 中移除所有項(xiàng)。/// </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} 的元素復(fù)制到一個(gè) Array 中。/// </summary>/// <param name="array">作為從 ICollection{T} 復(fù)制的元素的目標(biāo)的一維 Array。 Array 必須具有從零開始的索引。</param>/// <param name="arrayIndex">array 中從零開始的索引,從此索引處開始進(jìn)行復(fù)制。</param>public void CopyTo(T[] array, int arrayIndex){Data.CopyTo(array, arrayIndex);}/// <summary>/// 獲取 ICollection{T} 中包含的元素?cái)?shù)。/// </summary>public int Count{get { return Data.Count; }}/// <summary>/// 獲取一個(gè)值,該值指示 ICollection{T} 是否為只讀。/// </summary>public bool IsReadOnly{get { return false; }}/// <summary>/// 從 ICollection{T} 中移除特定對象的第一個(gè)匹配項(xiàng)。/// </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}

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

/// <summary>/// 關(guān)于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));elsereturn 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表示走M(jìn)VC路由/// </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}

這樣,我們前臺調(diào)用分頁時(shí),還是一句話就搞定了,呵呵!

事實(shí)上,對于PagedResult我們也可以用在其它ORM工具上,因?yàn)橐欢ǖ臄?shù)據(jù)庫和NoSql都開放了limit及skip等功能,大家可以放眼去看,放心去想,呵呵!

回到目錄

轉(zhuǎn)載于:https://www.cnblogs.com/lori/p/4418584.html

總結(jié)

以上是生活随笔為你收集整理的MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。