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

时间:2023-03-09 04:30:52
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 - ) * pageSize;
var limit = pageSize;
var recordCount = _table.Count();
return new PagedResult<TEntity>(
recordCount,
(int)(recordCount + pageSize - ) / 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>(, , , , null);
#endregion #region Ctor
/// <summary>
/// 初始化一个新的<c>PagedResult{T}</c>类型的实例。
/// </summary>
public PagedResult()
{
Data = new List<T>();
AddParameters = new NameValueCollection();
PageSize = ;
}
/// <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
,
, 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
,
, 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 }

这样,我们前台调用分页时,还是一句话就搞定了,呵呵!

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbQAAAAvCAIAAAAEgKglAAAEzUlEQVR4nO2dPW7iQBiGI3EbJC6TJpfgApQucoY0i5Qe0aGUSChaJQ1IFJEQ6VYCulBwgNmCP8N8tsfz4/Eoj/UUxMQz43m/eTTgaPdh/7MHAIA7HqKPAACghSBHAAAB5AgAIIAcAQAEAsrxp8EjVr8mh5exeW+k05/Y0Z7bCXS0oYat00md6EJsTo7N3INe0NGn1e/YQjTiS47kFaLf6JJCjnvkmMTYkGNaeUVMJ3WiF0Ae5JjA2JBjWnlFTCd1ohdAnghy1Kcgf8Zi+moVtEsAocdmOJPIMW5elW2699u8lZRSSin9tcdm61ZXdOLsHDu3Niyv77odhZNj2LGtlt3+56t1I6tl91xhj+/VjYil2Xs7qNNxyJ4d5bgZZEYj0RsJtIR85VXSjviWRb+GKinIaz5S26fLrw23Sqmvt5kfOQ63SimVb7/4vCo4kKOHojecrChy9Dy2989Of9Kxl+P3Y386WO33P0dLnl8XXyXM//P6Sym1mHf6s2wnLYA6cvwYTw01nVxeDdSwkRyL8hpu1WJ+/rXjW37k+LS4+O2mNsTzSqk/f//V3ZB6ydoXMb9zLJqLunPX5GILMbbXl0mnPx28O+wc3z87L9/5BnUr1Vl+s2yn1G7ds5bjatnNPh9td44tz8tkSI79GsmxIK/e2+Giwt7bQe0OX6VyLNrf3bpsPro5fZFg0Xm5/cp7ccnaO03L0WReSqRp0lHlYnPJI+DYHD9WX8ntIouvKg5iPlKFZjST42aQTQcr+4/V+sRaL5sQeenXeq/hOma8z+tpoUbDSad/3FoesuG6XI55hemv872MhpcP8jdylM7faFH8ETnaFGtoObrcVOvluBlkk+54U9lI+VJ5Wth/rP4YT7vjjct3juLE2gUXTo7lS7pBOd7lNct2x+8fZ9lOqcX8+Onb13eOogT186IWTRRpEXE42r5zNJGmFzlW1l/wsXmQ4/djXzajflXF/Q63Sp03ILXkuFp2s+XHz967HPXXsfK6u1acGcd+68rxmtfz+mu37p1sdcieJ1HkWNK4SWotoe07x8bkaEh75bhadgsegIhXBZLj8TlMHl3WLnnVjS+cHMuXdDQ5np7GnJ7D3BzXpzT32io/7ORo3iZyrE7dV2H9RjlWmVG/qmiBHbcYLh+rz/jfOVrEF06O4kz66tdciHd55Z/GnDDbORrCztEP1jvHu5OVsxbxT0N8js1Bjvp+ze5pde7v5uQqjy7HNuRVa0nb9VtTVde8rk9jasox768Sl9WS46Ud/QVytNw5isVUMncNL7ZwYzOcSS+NGC4/Bzn6uZ0W5qW3VvTaul/rdOzQnWW+1zNp09C8yLFi51g+R+JblQVda8GXEGJsFjOJHCPmJV51Nz/u/cY1o7sfdRvmmypp2TrrEPAPTyQwtt8sxxTziphO6kQvgDzIMYGxIce08oqYTupEL4A8yDGBsSHHtPKKmE7qRC+APPw3CcEPL2Pz3ogvOUa8nUBHG2o4uqSQY1g5AgCkC3IEABBAjgAAAsgRAEAAOQIACCBHAAAB5AgAIIAcAQAEkCMAgAByBAAQQI4AAALIEQBAADkCAAggRwAAAeQIACCAHAEABJAjAIAAcgQAEECOAAACyBEAQAA5AgAIIEcAAIH/eW3G6c7vuloAAAAASUVORK5CYII=" alt="" />

事实上,对于PagedResult我们也可以用在其它ORM工具上,因为一定的数据库和NoSql都开放了limit及skip等功能,大家可以放眼去看,放心去想,呵呵!

回到目录