在SharePoint对象模型中遍历所有列表项的性能问题

使用SharePoint对象模型,可以有很多种方法获取列表中的每个列表项目,可以使用for语句,也可以使用foreach语句,建议大家使用foreach语句来遍历列表中的项目。

在开发过程中使用foreach语句遍历列表中的项目时,要注意方法,否则也会造成性能问题。例如:使用如下代码遍历列表中的所有项目:

protected void GetSPListItem() {
   SPWeb web = SPContext.Current.Web;
  SPList list = web.Lists.TryGetList("任务");
  foreach (SPListItem item in list.Items)
    {
      Response.Write(item["Title"].ToString());
    }
}

使用这段代码在数据量非常小的情况下不会出现问题,但如果数据量稍微超过上百条,就会出现严重的性能问题。因为这段代码在执行时,由于使用了Items属性,因此会在内容数据库中往返原数量的2倍的次数,假如此列表中有200条数据,则Items属性会往返数据库至少400次,这是何等的浪费资源。

在每次的循环时,每次访问Items属性的时候,都会得到一个新的SPListItemCollection对象,Items属性未被缓存,因此总是从数据库中反复不断地请求所有数据项。图3-1是第一个循环迭代的情况:

Items迭代的分析图

图3-1

如果要避免图3-1这样无数次的访问数据库,正确的方法应该将Items属性得到的结果存储在内存中,由于Items的结果集类型为SPListItemCollection,因此可以使用如下代码将第一次返回的结果集缓存起来:SPListItemCollection itemColl = list.Items;

这样,数据库就只会查询一次,只需要遍历存储在itemColl对象里面的结果集即可。代码如下:

SPListItemCollection itemColl = list.Items;

foreach (SPListItem item in itemColl){

        Response.Write(item["Title"].ToString());

}

由于itemColl存储了需要遍历的所有列表项,并且此结果集是存储在内存中的,因此遍历起来速度很快的。

posted @ 2013-03-20 15:40  gaoxingstyle  阅读(510)  评论(0编辑  收藏  举报