Как запросить все списки, использующие определенный тип контента в SharePoint?

У меня есть следующий запрос CAML:

   <Where>
      <And>
         <Eq>
            <FieldRef Name='PublishToSM' />
            <Value Type='Boolean'>True</Value>
         </Eq>
         <IsNull>
            <FieldRef Name='SMUpdateDate' />
         </IsNull>
      </And>
   </Where>

У меня есть только один тип контента, который использует эти поля. Когда я запускаю этот запрос к списку, который использует этот тип контента, все работает нормально. Когда я запускаю его со списком, который не работает, он выдает ошибку: One or more field types are not installed properly. Go to the list settings page to delete these fields.

Я хотел бы иметь возможность выполнять поиск по всем спискам на всех веб-сайтах в семействе сайтов. Можно ли это сделать без ошибок?


person Abe Miessler    schedule 13.01.2011    source источник


Ответы (1)


Используйте SPSiteDataQuery, добавьте предложение where для включения типа контента. то есть:

<Where>
  <And>
    <Eq>
      <FieldRef Name='ContentType' />
      <Value Type='Text'>CONTENTTYPE NAME</Value>
    </Eq>
    <And>
      <Eq>
         <FieldRef Name='PublishToSM' />
         <Value Type='Boolean'>True</Value>
      </Eq>
      <IsNull>
        <FieldRef Name='SMUpdateDate' />
      </IsNull>
    </And>
  </And>
</Where> 

<BeginsWith>
  <FieldRef Name='ContentTypeId' />
  <Value Type='ContentTypeId'>CONTENTTYPE ID</Value>
</BeginsWith>

Установите для свойства SPSiteDataQuery Scope значение SiteCollection. Установив свойство Lists, вы также можете ограничить поиск, например, библиотеками документов и т. Д. Свойство ViewFields может быть установлено для ограничения извлекаемых полей (т.е. вместо эквивалента select * в полях элементов)

person Colin    schedule 13.01.2011
comment
Хм, похоже, это сработает, но с моим методом до того, как я использовал ListItem.Update для обновления поля после того, как я его нашел. Смогу ли я сделать это, если переключусь на SPSiteDataQuery? - person Abe Miessler; 13.01.2011
comment
Кроме того, я заметил, что для запуска требуется ДЕЙСТВИТЕЛЬНО много времени. Это нормально? - person Abe Miessler; 13.01.2011
comment
Он работал около 40 минут, а затем выдал мне ошибку нехватки памяти на сервере, когда я утомил его с помощью SPSiteDataQuery. - person Abe Miessler; 13.01.2011
comment
Нет, это не займет много времени, чтобы обновить поле, оно должно быть включено в ViewFields запроса. - person Colin; 14.01.2011
comment
Вы также можете попробовать изменить предложение ContentType на то, что я добавил в редактирование - person Colin; 14.01.2011
comment
Есть идеи, почему это заняло так много времени? Предложения о том, где мне начать искать? - person Abe Miessler; 14.01.2011