我有77个SPListItem对象的集合。这些对象可以对其他对象具有隐含的递归引用*。此层次结构中目前有4个级别。
我遇到的问题是,当我获得层次结构较深的项目时,检索它们需要花费很长时间。我在每个级别看到的时间:
zeroth: nearly instant
first: 2 seconds
second: 20 seconds
third: goes for about a minute and then times out
这是SPListItem对象中字段的结构:
ID
Title
ParentId //recursive field
这是我用来获取每个级别的SPListInformation的代码:
SPList navList = SPContext.Current.Web.Lists["NavStructure"];
//Get items that have no parent
var zero = from n in navList.Items.Cast<SPListItem>()
where ((SPFieldLookupValueCollection)n["Parent"]).Count == 0
select new { ID = n.ID, Title = n.Title };
//Get first level items
var first = from n in navList.Items.Cast<SPListItem>()
from z in zero
where ((SPFieldLookupValueCollection)n["Parent"]).Select(t => t.LookupId).Contains(z.ID)
select new { ID = n.ID, Title = n.Title, ParentId = z.ID};
lv_First.DataSource = first.ToList();
lv_First.DataBind();
//Get second level items
var second = from n in navList.Items.Cast<SPListItem>()
from z in first
where ((SPFieldLookupValueCollection)n["Parent"]).Select(t => t.LookupId).Contains(z.ID)
select new { ID = n.ID, Title = n.Title, ParentId = z.ID};
lv_Second.DataSource = second.ToList();
lv_Second.DataBind();
//Get third level items
var third = from n in navList.Items.Cast<SPListItem>()
from z in second
where ((SPFieldLookupValueCollection)n["Parent"]).Select(t => t.LookupId).Contains(z.ID)
select new { ID = n.ID, Title = n.Title, ParentId = z.ID};
lv_Third.DataSource = third.ToList();
lv_Third.DataBind();
任何人都可以看到我在这里做的事情会导致我看到的长时间运行吗?
如果有人想看到这些数据,请告诉我。我把它遗漏了,因为它会有点冗长。
*当我说“暗示递归引用”时,我的意思是每个SPListItem对象中都有一个成员可以包含一个ID,并且该ID引用列表中的另一个对象,但不强制执行此关系。
答案 0 :(得分:5)
好吧,您正在执行first
中navList
中每个项的second
查询...并且每次执行{{1查询您再次对first
中的每个项执行zero
查询。 navList
为每个项目再次再次。
只需在每个查询结尾处添加对third
的调用,都可能会显着加快速度。
你要做的事情并不是很清楚,但感觉你可能会使用ToList
或Dictionary
而不是在每次你想要的时候迭代整个集合找到一些东西。
答案 1 :(得分:2)
您正在重新枚举每次传递的所有先前枚举,因为您直接使用IEnumerable。我建议存储由ToList()创建的列表,并在随后的调用中使用它。