2010-07-02 42 views
1

我目前檢索所有頁面和過濾掉未發佈代碼的,檢查DateTime.Now是否比這更小:CAML查詢只檢索SharePoint 2007發佈的頁面?

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查詢什麼,讓我的SharePoint不從數據庫中拉出不必要的項目?

+1

根據此示例(http://www.stum.de/2008/03/13/caml-queries /),無論答案如何,這將是一個可怕的褻瀆,並提醒爲什麼Sharepoint是惡魔的化身。 – Juliet 2010-07-02 07:12:23

+0

CAML.Net http://camldotnet.codeplex.com/有所幫助。 – skolima 2010-07-02 10:32:38

回答

2

在我的眼中,你檢查的方式太多了。

後,再選中「PublishingStartDate」 < =今天和「PublishingExpirationDate」>今天

對於普通用戶來說,你會找不到未發佈/批准頁面。
對於有權查找這些網頁的用戶,您可能不希望僅因爲當前版本未發佈/覈准而將其排除。如果您只想要至少發佈一個版本的頁面,那麼您可以添加「_UIVersion」> = 512的檢查

+0

問題是我試圖緩存結果,並且最初的查詢正在以完整的權限運行。我正在考慮改變我的緩存現在的工作方式。 – skolima 2010-07-02 12:12:20

+0

但是,如果您使用您在問題中指定的條件運行,那麼即使舊版本已發佈/批准,也會排除新版本正在進行的頁面 – 2010-07-02 12:38:27

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>