我的问题更多的是“有更好的方法吗”问题然后是“我该怎么办”的问题。我的代码如下:
private List<SPListItem> GetListItemsFromSite(SPSite spSite)
{
List<SPListItem> listItems = new List<SPListItem>();
List<SPList> documentLibrariesInSite = GetCustomDocumentLibrariesInSite(spSite);
foreach (SPList spList in documentLibrariesInSite)
{
SPListItemCollection itemCollection = GetLatestDocumentsFromSPList(spList);
foreach(SPListItem item in itemCollection)
{
listItems.Add(item);
}
}
listItems.Sort((x, y) => ((DateTime) x[SPBuiltInFieldId.Created]).CompareTo(((DateTime) y[SPBuiltInFieldId.Created])));
listItems.Reverse();
return listItems;
}
private SPListItemCollection GetLatestDocumentsFromSPList(SPList spList)
{
SPQuery query = new SPQuery();
query.Query = "<Where><Gt><FieldRef Name=\"Created\" /><Value Type=\"DateTime\"><Today OffsetDays=\"-7\"</Value></Gt></Where>";
query.ViewAttributes = "Scope=\"Recursive\"";
query.RowLimit = NumberOfDocumentsToGet;
SPListItemCollection listItemCollection = spList.GetItems(query);
return listItemCollection;
}
private List<SPList> GetCustomDocumentLibrariesInSite(SPSite spSite)
{
List<SPList> listCollection = new List<SPList>();
foreach (SPWeb spWeb in spSite.AllWebs)
{
foreach (SPList spList in spWeb.Lists)
{
if (spList.TemplateFeatureId == CustomContentTypeFeatureGuid)
{
listCollection.Add(spList);
}
}
spWeb.Dispose();
}
return listCollection;
}
由于我希望在返回项目之前按创建日期排序列表项目,我会根据SPListItem上的CreatedDate字段进行排序。我也不使用SPSiteDataQuery,因为我想操纵我得到的SPListItem。
现在的问题是,我是否有任何方法可以提高效率或“更清洁”?欢迎任何有关此事的想法。
答案 0 :(得分:1)
你可以在where子句
之后为你的查询添加一个orderby子句<强>升序强>
<OrderBy>
<FieldRef Name="Created" Ascending="True" />
</OrderBy>
<强>降序强>
<OrderBy>
<FieldRef Name="Created" Ascending="false" />
</OrderBy>
答案 1 :(得分:0)
如果自定义列表中的项目具有公共托管属性或属性集,则可以为它们构建自定义搜索范围并查询此范围,而不是单独遍历每个列表。但是,如果您需要实时结果,这将无效,但如果您将增量爬网设置得足够频繁,则可以更快,更轻松地获取项目,尤其是如果您有许多自定义列表。