• 在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存储了需要遍历的所有列表项,并且此结果集是存储在内存中的,因此遍历起来速度很快的。

  • 相关阅读:
    echo 变量不加引号出错
    linux以16进制方式查看文件
    批量删除符合条件的文件
    sed删除行
    linux用户环境变量
    脚本路径问题_dirname
    shell脚本返回字符串
    关于Unix时间戳
    grunt用来压缩前端脚本
    JAVA ThreadPoolExecutor(转)
  • 原文地址:https://www.cnblogs.com/gaoxingstyle/p/2971300.html
Copyright © 2020-2023  润新知