如何从多个列表中最好地排序SPListItems列表?

时间:2011-03-03 12:15:09

标签: c# sharepoint-2007 lambda

我的问题更多的是“有更好的方法吗”问题然后是“我该怎么办”的问题。我的代码如下:

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。

现在的问题是,我是否有任何方法可以提高效率或“更清洁”?欢迎任何有关此事的想法。

2 个答案:

答案 0 :(得分:1)

你可以在where子句

之后为你的查询添加一个orderby子句

<强>升序

<OrderBy> 
   <FieldRef Name="Created" Ascending="True" />
</OrderBy>

<强>降序

<OrderBy> 
   <FieldRef Name="Created" Ascending="false" />
</OrderBy>

答案 1 :(得分:0)

如果自定义列表中的项目具有公共托管属性或属性集,则可以为它们构建自定义搜索范围并查询此范围,而不是单独遍历每个列表。但是,如果您需要实时结果,这将无效,但如果您将增量爬网设置得足够频繁,则可以更快,更轻松地获取项目,尤其是如果您有许多自定义列表。