SPList.GetItemById(int)和SPList.Items.GetItemById(int)的区别
2012-03-13 11:48
495 查看
公司有一个文档库,因为同事提交的文档要进行权限和内容的处理,所以之前搭建此功能的同事在此文档库里面加入了EventHandler事件处理。这个文档库主要工作都是集中到每个月的几天,导致这几天都要经常重启IIS或者服务器。只能去查看源代码了。
在查看源代码的过程中,没有发现有什么问题出现。只能通过EventHandler调试方式来进行源代码的调试(EventHandle调试方式网上找的),进行调试的时候发现,在进行权限处理之前的SPListItem的获取很慢,都要20秒左右(此文档库里面有3万多的文档),红色的代码为出问题的地方,代码如下:
查找了许多资料也没有找出是什么原因,后来想到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,所以我们理解就是这样,希望大家看到后可以给我一些明确的指导。在此先谢谢了!
在查看源代码的过程中,没有发现有什么问题出现。只能通过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,所以我们理解就是这样,希望大家看到后可以给我一些明确的指导。在此先谢谢了!
相关文章推荐
- SPList.GetItemById(int)和SPList.Items.GetItemById(int)的区别
- getElementById getElementsByName的用法与区别(转)
- js中document.getElementById(ID)与document.getElementsByName(Name)的区别
- jquery中的 $(#id)与document.getElementById( id )的区别
- Ext.get(),Ext.getCmp(),Ext.getDom(),document.getElementById()之间的区别
- document.getElementById与getElementByName的区别
- document.getElementById方法在Firefox与IE中的区别
- getElementById() , getElementsByName() 和 getElementsByTagName()的区别
- getElementsByName和getElementById的区别、用法
- getElementById与getElementsByTagName的区别
- jquery中的$("#id")与document.getElementById("id")的区别
- jquery中的$("#id")与document.getElementById("id")的区别
- jquery中的 $(#id)与document.getElementById( id )的区别
- jquery中的$("#id")与document.getElementById("id")的区别
- jq中的$("#id")与js中的document.getElementById("id")的区别
- getElementById与getElementsByTagName的区别
- EF映射——linq to Entity ,不支持方法 get_item(int 32) 无法转换为存储表达式
- JS中获取元素使用getElementByID()、getElementsByName()、getElementsByTagName()的用法和区别
- getElementByID() getElementsByName() getElementsByTagName()的区别
- C4 - Item 30 了解prototype,getPrototypeOf以及__proto__的区别