回到目录

对于数据分页,我们已经见的太多了,几乎每个列表页面都要用到分页,这已经成了一种定理了,在进行大数据展示时,如果不去分页,而直接把数据加载到内存,这简直是不可以去相向的,呵呵,在很多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等功能,大家可以放眼去看,放心去想,呵呵!

回到目录

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法的更多相关文章

  1. MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

    回到目录 MongoDB的官方驱动,语法更好,更强 之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引 ...

  2. MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

    回到目录 上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是 ...

  3. MongoDB学习笔记~为IMongoRepository接口更新指定字段

    回到目录 对于MongoDB来说,它的更新建议是对指定字段来说的,即不是把对象里的所有字段都进行update,而是按需去更新,这在性能上是最优的,这当然也是非常容易理解的,我们今天要实现的就是这种按需 ...

  4. MongoDB 学习笔记(三):分页、排序与游标

    一.分页 1.limit返回指定条数的数据 2.skip指定跨度 3.limit与skip结合,进行分页 二.排序 1.sort排序:指定排序的key,大于0为升序,小于0为降序.如果指定了多个排序键 ...

  5. MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

    回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...

  6. MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

    回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...

  7. Mongodb学习笔记(二)Capped Collection固定集合

    一.Capped Collection固定集合 简单介绍 capped collections是性能出色的有着固定大小的集合(定容集合),以LRU(Least Recently Used最近最少使用) ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

随机推荐

  1. spring整合hibernate的时候报异常org.hibernate.HibernateException: createQuery is not valid without active transaction

    在整合Spring4+hibernate4时候,当代码执行到dao中CRUD操作时,报了一个异常, org.hibernate.HibernateException: createQuery is n ...

  2. C++中的std详解

    以下内容为:本人看C++视频教程-范磊主讲(2.91G)视频学习笔记. 与大家分享下,希望可以帮助大家学习c++! 引例: #include<iostream> int main() { ...

  3. 项目积累html标签

    今天遇到一个不太常用都标签,网上以后慢慢记下项目中用到都东西. 1.<em> 标签 告诉浏览器把其中的文本表示为强调的内容.对于所有浏览器来说,这意味着要把这段文字用斜体来显示. 在文本中 ...

  4. Xamarin.Android之给我们的应用加点过渡效果

    零.前言 试想一下,我们的应用正在请求一些数据,假设网络不是很好,要花比较长的时间等待,这个时候界面什么反应也没有, 一动不动,用户可能就会认为应用挂掉了,这么久都没反应的,说不定下一分钟用户就把它卸 ...

  5. java条件语句练习题

    输入三个数字显示最大的: System.out.println("请输入三个数字:"); int a,b,c; Scanner d = new Scanner(System.in) ...

  6. ffmpeg实现dxva2硬件加速

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.这是第二篇,记录用ffmpeg实现dxva2. 第一篇翻译的Direct3D device manager,链接:http: ...

  7. 转载:《TypeScript 中文入门教程》 16、Symbols

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 至ECMAScript 2015开始,symbol成为了一种新的原始类型,就像n ...

  8. Hibernate 参数设置一览表

    Hibernate 参数设置一览表 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 fu ...

  9. OData V4 系列 .net应用

    OData 学习目录 添加 OData Client Code Generator 扩展 添加OData T4生成工具 修改 T4 模板的 MetadataDocumentUri 运行Web项目,之后 ...

  10. 缓存、队列(Memcached,Redis,rabbitMQ)

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...