CAML查询仅从SharePoint 2007检索已发布的页面?

时间:2010-07-02 06:52:29

标签: c# sharepoint caml

我目前正在检索所有页面并过滤掉未在代码中发布的页面,检查DateTime.Now是否小于此值:

static readonly DateTime IMMEDIATE_PUBLISH = new DateTime(1900, 1, 1);

public static DateTime PublicationDate(this SPListItem item)
{
    // get start publish date
    PublishingPage page = item.Publishing();
    if (page != null)
    {
        bool isPublished = (page.ListItem.File != null)
            ? (page.ListItem.File.Level == SPFileLevel.Published)
            : true;
        bool isApproved = (page.ListItem.ModerationInformation != null)
            ? (page.ListItem.ModerationInformation.Status == SPModerationStatusType.Approved)
            : true;
        if (isPublished && isApproved && (DateTime.Now < page.EndDate))
        {
            return page.StartDate == IMMEDIATE_PUBLISH ? page.CreatedDate : page.StartDate;
        }
        return DateTime.MaxValue;
    }
    // not a scheduled item. treat as published
    return DateTime.MinValue;
}

等效的CAML查询是什么,以便I SharePoint不会从数据库中提取不必要的项目?

2 个答案:

答案 0 :(得分:2)

在我的观点中,你的检查方式太多了。

您应该只检查“PublishingStartDate”&lt; = Today和“PublishingExpirationDate”&gt;今天

对于普通用户,您将找不到未发布/批准的页面 对于有权查找这些页面的用户,您可能不希望仅仅因为当前版本未发布/批准而将其排除。如果您只想要发布至少一个版本的页面,那么您可以添加“_UIVersion”&gt; = 512

的检查

答案 1 :(得分:2)

以下是用于检查文档发布的CAML查询示例。我知道这是一个相当古老的问题,但希望这可能对下一个搜索如何做到这一点的人有用:

<Query>
    <Where>
        <And>
            <Or>
                <Leq>
                    <FieldRef Name='PublishingStartDate'/>
                    <Value Type='DateTime' IncludeTimeValue='TRUE'>
                        <Today/>
                    </Value>
                </Leq>
                <IsNull>
                    <FieldRef Name='PublishingStartDate'/>
                </IsNull>
            </Or>
            <Or>
                <Geq>
                    <FieldRef Name='PublishingExpirationDate'/>
                    <Value Type='DateTime' IncludeTimeValue='TRUE'>
                        <Today/>
                    </Value>
                </Geq>
                <IsNull>
                    <FieldRef Name='PublishingExpirationDate'/>
                </IsNull>
            </Or>
        </And>
    </Where>
</Query>