Получить Spquary Totalitems из запроса
-
10-12-2019 - |
Вопрос
Я хочу получить общее количество предметов, которые соответствуют моему запросу, но также ограничивают результаты.
- .
- так сказать, у меня есть 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