Клиентская объектная модель Sharepoint 2010 — большая библиотека — поиск элемента без итерации

У меня есть большая библиотека документов (на данный момент ~ 6000 документов), и мне нужно найти документ на основе значения настраиваемого поля (настраиваемый столбец в библиотеке).

Есть ли способ вернуть этот документ, не перебирая все 6000 документов?

Я понимаю, что в какой-то момент должна произойти итерация, но я бы предпочел, чтобы она происходила на стороне сервера SharePoint, а не передавала их все на сторону клиента, а затем выбирала документ.

Спасибо


person Russell    schedule 01.07.2011    source источник


Ответы (1)


Вы можете запросить Sharepoint. Вы отправляете запрос CAML, который выполняется на сервере и возвращает только те элементы, которые соответствуют указанным вами критериям. Вы указываете имя пользовательского столбца для поиска и указываете значение для поиска. Для эффективности вы можете запросить только несколько полей назад (например, URL-адрес документа). Таким образом, вам не нужно перебирать документы в списке, чтобы найти элемент.

Здесь вы можете найти обсуждение: http://msdn.microsoft.com/en-us/library/ee956524.aspx, а также вы можете найти примеры того, как это сделать из javascript или silvelight.

Пример CAML:

        CamlQuery camlQuery = new CamlQuery();
    camlQuery.ViewXml =
        @"<View>
            <Query>
              <Where>
                <Eq>
                  <FieldRef Name='FileLeafRef'/>
                  <Value Type='Text'>Test.docx</Value>
                </Eq>
              </Where>
              <RowLimit>1</RowLimit>
            </Query>
          </View>";
person KJRB    schedule 04.07.2011
comment
Однако этот запрос Caml возвращает документ по имени файла. Как вы запрашиваете идентификатор документа? Я уже пробовал идентификатор документа, значение идентификатора документа и т. д. без успеха... - person Russell; 04.07.2011
comment
Если это поле идентификатора Sharepoint, его имя будет ID. Если это имя вашего пользовательского поля, то, скорее всего, оно будет Document_x0020_ID. Sharepoint заменяет пробелы в именах полей на x0020. Кроме того, Sharepoint усекает имя поля, если оно слишком длинное, и вам также необходимо знать тип поля. Если это встроенное поле идентификатора, его типом является счетчик, например: ‹FieldRef Name='ID'/› ‹Value Type='Counter'›123‹/Value›. Если ваше поле является настраиваемым текстовым полем: ‹FieldRef Name='Document_x0020_ID'/› ‹Value Type='Text'›xxxx‹/Value› должно работать. - person KJRB; 05.07.2011
comment
Если приведенное выше предложение не сработает (возможно, исходное имя поля было установлено на что-то отличное от идентификатора документа), вам нужно будет выяснить, какое внутреннее имя поля для вашего столбца идентификатора документа. Один из способов увидеть это — посмотреть на URL соответствующего столбца сайта. Вы должны увидеть внутреннее имя в URL-адресе этой страницы (field=). Отображаемое имя поля не совпадает с внутренним именем. Запросы CAML используют внутренние имена. - person KJRB; 05.07.2011
comment
Да, я говорю о внутреннем идентификаторе документа Sharepoints. Я попробую простое поле ID, ура. - person Russell; 05.07.2011
comment
Поле идентификатора возвращает идентификатор GUID, а не идентификатор документа. - person Russell; 05.07.2011
comment
Я надеюсь, что вы уже решили свою проблему ... но если нет, я думаю, что это поможет, если вы укажете, что такое: ID документа. ID должен быть целым числом, UniqueID — это Guid. Оба встроены в поля sharepoint. Можете ли вы определить идентификатор документа .. если это настраиваемое поле или встроенное поле (я не думаю, что это встроенное). - person KJRB; 08.07.2011
comment
Я говорю об идентификаторе документа, представленном в SharePoint 2010: blogs.technet.com/b/blairb/archive/2009/10/20/ - person Russell; 08.07.2011
comment
Внутреннее имя для этого поля должно быть: _dlc_DocId. Это работает для меня: @‹View› ‹Query› ‹Where› ‹Eq› ‹FieldRef Name='_dlc_DocId'/› ‹Value Type='Text'›xxx‹/Value› ‹/Eq› ‹/Where› ‹/ Query› ‹RowLimit›100‹/RowLimit› ‹/View›; Дополнительные сведения: msdn.microsoft.com/en-us/library/ee559302.aspx . Я совершенно уверен, что имя правильное (без ошибок) - person KJRB; 14.07.2011