Вопрос

Я хочу получить общее количество предметов, которые соответствуют моему запросу, но также ограничивают результаты.

    .
  • так сказать, у меня есть 100 предметов в списке.
  • 50 из 100 элементов в списке соответствуют моему запросу.
  • я хочу получить только 10 из 50.
  • Как я могу получить "50"?

    Простой запрос:

    SPQuery query = new SPQuery() { Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>" };
    SPList oList = web.Lists["Profile"];
    SPListItemCollection items = oList.GetItems(query);
    int count = items.Count;
    
    .

Это было полезно?

Решение

Это хорошо известно и очень сложно решить проблему, особенно когда речь идет о больших объемах данных. Даже не трогательно SharePoint, вы, возможно, заметили, что многие системы (Google является очевидным примером), возвращают только приближенное количество фильтрованных элементов.

В основном единственное, что вы можете сделать, это выполнить тот же запрос, но исключать разрешения и все поля, кроме удостоверения личности из результатов. Так что с точки зрения SQL это будет что-то подобное:

SELECT id FROM list WHERE (filter)
.

Если у вас есть более 5 000 элементов в списке (или другом значении, которое превышает «ограничение по включению», которое вы можете найти в параметрах веб-приложения), вам придется поставить все поля, которые участвуют в Фильтр для индексации (см. Ссылка «Индексированные столбцы» на странице «Настройки списка»), и вам придется отказаться от фильтрации на поисках полей (Это поля следующих типов: поиск, управляемые метаданные, люди и группа, статус рабочего процесса).

Также рекомендуется ограничить даже этот запрос в некотором большом количестве, скажем, 100 тысяч товаров или что-то подобное, так что это будет:

SELECT TOP 100000 id FROM list WHERE (filter)
.

Так, как это будет выглядеть применено к Ssquery?

var query = new SPQuery()
{
    // please make sure FirstName and FullName fields are added to index!!
    Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>",
    ViewFields = "ID",
    ViewFieldsOnly = true,
    IncludePermissions = false,
    RowLimit = 100000
};
.

Пожалуйста, имейте в виду, что он будет работать медленно, если у вас есть большое количество элементов или у вас тяжелый (в терминах SQL) фильтра.

Другие советы

realtime queries Hat Performance Довольно трудно, на самом деле нет хорошего способа подсчитать элементы в списке, не повторяя их через них.

Также имейте в виду ItemCount и List.items.count вернет разные номера в некоторых случаях.

Для больших списков есть рассуждения за настоящим решением: http://technet.microsoft.com/en-us/library/cc262813.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top