您的位置:首页 > 其它

SPList.GetItemById(int)和SPList.Items.GetItemById(int)的区别

2012-03-13 11:48 495 查看
公司有一个文档库,因为同事提交的文档要进行权限和内容的处理,所以之前搭建此功能的同事在此文档库里面加入了EventHandler事件处理。这个文档库主要工作都是集中到每个月的几天,导致这几天都要经常重启IIS或者服务器。只能去查看源代码了。
  在查看源代码的过程中,没有发现有什么问题出现。只能通过EventHandler调试方式来进行源代码的调试(EventHandle调试方式网上找的),进行调试的时候发现,在进行权限处理之前的SPListItem的获取很慢,都要20秒左右(此文档库里面有3万多的文档),红色的代码为出问题的地方,代码如下:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite Site = new SPSite(properties.SiteId))
{
using (SPWeb Web = Site.OpenWeb(properties.OpenWeb().ID))
{
StringBuilder sb = new StringBuilder();
SPList List = Web.Lists[properties.ListId];
SPListItem Item = List.Items.GetItemById(properties.ListItemId);

SPRoleDefinition Read = Web.RoleDefinitions["读取"];
SPRoleDefinition Create = Web.RoleDefinitions["创建"];
SPRoleDefinition Delete = Web.RoleDefinitions["删除"];
SPRoleDefinition Edit = Web.RoleDefinitions["编辑"];

SPUser Author = Utility.GetFieldUser(item, "创建者");
SPRoleAssignment Ra = new SPRoleAssignment(Web.EnsureUser(Author.LoginName));
if (!Item.HasUniqueRoleAssignments) Item.BreakRoleInheritance(false);

Ra.RoleDefinitionBindings.Add(Read);
Ra.RoleDefinitionBindings.Add(Create);
Ra.RoleDefinitionBindings.Add(Delete);
Ra.RoleDefinitionBindings.Add(Edit);

Item.RoleAssignments.Add(Ra);

}
}

});


  查找了许多资料也没有找出是什么原因,后来想到SharePoint的文档都是存放在数据库里面的,这个文档库有3万多个文档,GetItemById(properties.ListItemId)
就相当于 使用Where通过ID条件来查询出这个文档。那么SPList.Items.GetItemById中的SPList.Items是否是将此列表的所有文档3万多条记录都读取出来,有这个想法主要是可以使用 SPListItemCollection item = SPList.Items
来处理所有文档。如果这个成立的话那么慢的原因就出来了,此语句的操作是:先将这个文档库的所有Select出来再通过ID来读取我们想要的Item。

  那么是否有直接通过ID条件来获取Item的API吗,试一下,真是内牛满面,真有一个SPList.GetItemById 这个方法,试了一下,天呀。什么叫提高效率,这才叫提高效率,原本处理完11个文档要3分钟40秒即(220秒)而现在只要(3秒)。神马都是浮云。这是多少倍:220%3=73.333。天呀。怪不得,怪不得偶要累了一个月。

  偶晚上就给她更新到生产环境看看是否会再出重启IIS问题,同时因为我只学习了二个月的SharePoint,且主要都是在处理各种原来存在的Bug,所以我们理解就是这样,希望大家看到后可以给我一些明确的指导。在此先谢谢了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: