2010-07-02 4 views
1

Je suis train de les récupérer actuellement toutes les pages et filtrer ceux qui ne sont pas publiées dans le code, vérifier si DateTime.Now est plus petit que cela:Requête CAML pour récupérer uniquement les pages publiées à partir de 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; 
} 

Quelle serait l'équivalent requête CAML, de sorte que je SharePoint ne tirer des éléments inutiles de la base de données?

+1

Selon cet échantillon (http://www.stum.de/2008/03/13/caml-queries /), quelle que soit la réponse, ce sera un blasphème hideux et un rappel de pourquoi Sharepoint est le diable incarné. – Juliet

+0

CAML.Net http://camldotnet.codeplex.com/ aide un peu. – skolima

Répondre

2

Dans mon opion, vous vérifiez trop.

Vous ne devriez vérifier « PublishingStartDate » < = Aujourd'hui et « PublishingExpirationDate »> Aujourd'hui

Pour les utilisateurs ordinaires vous ne trouverez pas les pages qui ne sont pas publiés/approuvés.
Pour les utilisateurs ayant le droit de trouver ces pages, vous ne voulez probablement pas les exclure simplement parce que la version actuelle n'est pas publiée/approuvée. Si vous voulez uniquement des pages où au moins une version est publiée, vous pouvez ajouter une vérification pour "_UIVersion"> = 512

+0

Le problème est que j'essaie de mettre en cache les résultats et que la requête initiale est exécutée avec tous les droits. Je cherche à changer le fonctionnement de mon cache en ce moment. – skolima

+0

Mais si vous utilisez les critères que vous avez spécifiés dans votre question, vous excluez les pages où une nouvelle version est en cours même si une ancienne version est publiée/approuvée –

2

Voici un exemple de requête CAML pour vérifier qu'un document est publié. Je suis conscient que c'est une question assez ancienne mais nous espérons que cela pourrait être utile à la personne suivante qui googles comment faire:

<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> 
Questions connexes