Запрос CAML для извлечения только опубликованных страниц из SharePoint 2007?

В настоящее время я извлекаю все страницы и отфильтровываю те, которые не опубликованы в коде, проверяя, меньше ли 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 не извлекал ненужные элементы из базы данных?


person skolima    schedule 02.07.2010    source источник
comment
Согласно этому образцу (stum.de/2008/03/13/caml- запросы), каким бы ни был ответ, это будет отвратительное богохульство и напоминание о том, почему Sharepoint является воплощением дьявола.   -  person Juliet    schedule 02.07.2010
comment
CAML.Net camldotnet.codeplex.com немного помогает.   -  person skolima    schedule 02.07.2010


Ответы (2)


На мой взгляд, вы слишком много проверяете.

Вы должны проверить только «PublishingStartDate» ‹= Today и «PublishingExpirationDate» > Today

Для обычных пользователей вы не найдете страницы, которые не опубликованы/не одобрены.
Для пользователей с правами на поиск этих страниц вы, вероятно, не захотите их исключать только потому, что текущая версия не опубликована/не одобрена. Если вам нужны только страницы, на которых опубликована хотя бы одна версия, вы можете добавить проверку «_UIVersion» >= 512.

person Per Jakobsen    schedule 02.07.2010
comment
Проблема в том, что я пытаюсь кэшировать результаты, а исходный запрос выполняется с полными правами. Сейчас я пытаюсь изменить то, как работает мой кеш. - person skolima; 02.07.2010
comment
Но если вы работаете с критериями, указанными в вашем вопросе, вы исключите страницы, на которых разрабатывается новая версия, даже если старая версия опубликована/утверждена. - person Per Jakobsen; 02.07.2010

Ниже приведен пример запроса 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>
person David Clarke    schedule 10.07.2013