回到目录

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

    程序启动一个新线程的成本是很高的,因为涉及到要和操作系统进行交互,而使用线程池可以很好的提高性能,尤其是程序中当需要创建大量生存期很短的线程时,应该优先考虑使用线程池. 线程池的每一个线程执行完毕后, ...

  2. Front End Developer Questions 前端开发人员问题(三)JavaScript部分

    问题来源:http://markyun.github.io/2015/Front-end-Developer-Questions/ 三.javascript1.介绍JavaScript的基本数据类型. ...

  3. SAX解析技术

    SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包.SAX工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束.元素(element)开始 ...

  4. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...

  5. Spring 3.0 AOP (一)AOP 术语

    关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...

  6. 无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS"

    无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间 2011-0 ...

  7. 使用AOP+Annotation实现操作日志记录

    先创建注解 OperInfo @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @ ...

  8. 2016 ICPC大连站---F题 Detachment

    题意:输入一个x,将x拆分成一些小的数(这些数不能相同,即x=a1+a2+......   ai!=aj when i!=j),然后这些数相乘得到一个成积(s=a1*a2*......),求最大的乘积 ...

  9. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  10. Ext.NET MVC 配置问题总结

    随着VS版本和.NET MVC版本.EF的版本的不断更新,虽然很多功能随着版本的提升而更完善,但对于旧版本开发的软件就有点悲催了,或许很多开发者都遇到类似的问题! 最近有一个项目是用.NET MVC3 ...