Определить общее количество предметов, возвращаемых SPQuery - PullRequest
3 голосов
/ 27 октября 2010

Я выполняю несколько запросов CAML к большому списку в SharePoint 2010 и отображаю результаты в виде таблицы для конечного пользователя.Я хочу просмотреть результаты, возвращаемые запросом, чтобы повысить производительность.Однако мне необходимо отобразить общее количество элементов, возвращаемых запросом, в элементе управления подкачкой.У меня вопрос, как я могу определить общее количество элементов, которые будут возвращаться каждым запросом, фактически не возвращая их все в одной SPListItemCollection?Чтобы быть точным, я хочу просмотреть результаты 10 пунктов за один раз;как я могу это сделать и при этом иметь общее количество всех элементов, возвращаемых запросом?

Обновление

Пока ни один из приведенных ответов не ответил на мой вопрос- как таковой, я предлагаю щедрость.Мне нужно иметь возможность получить общее количество элементов, которые будет возвращать запрос CAML, без необходимости выполнять запрос и возвращать все элементы.Это позволит мне отображать это значение общего количества для конечного пользователя (установленное требование), одновременно просматривая коллекцию элементов, чтобы отобразить конкретную страницу результатов в виде сетки.Это позволит избежать значительного снижения производительности для больших списков на странице, содержащей первую загрузку gridview.

Если никто не предложит действительный ответ на вышеприведенный вопрос, я приму ответ, в котором будет дана ссылка на статью MSDN, в которой прямо сказано, что вышеуказанные функции не могут быть реализованы..

Ответы [ 8 ]

8 голосов
/ 03 ноября 2010

К сожалению, я не думаю, что вы получите окончательный ответ от MSDN о том, что не возможно ... только то, что является .Вот полная страница CAML Query Schema на msdn .Там нет упоминаний о каком-либо типе функции «подсчета».

Что касается решения вашей проблемы, сначала вам нужно выбрать правильный метод для поиска предметов.Например, вот пара случаев:

  1. Элементы из одного списка?CAML
  2. Предметы из пары списков на одном сайте?SPSiteDataQuery
  3. Элементы из многих списков на многих сайтах?API поиска

Во-вторых, вы можете реализовать какое-либо кэширование в своей веб-части, чтобы сократить время, необходимое для сортировки / страницы / фильтра.Мне нравится использовать System.Web.HttpRuntime.Cache для хранения DataTable (позволяет легко изменить метод получения элементов, в то время как ваша сетка может продолжать использовать данные).Вы также можете использовать Page.Session вместо кэширования.

2 голосов
/ 29 ноября 2010

Извините, но CAML-запрос не прошел ... еще раз

    <Aggregations Value="On">
        <FieldRef Name="LinkTitle" Type="COUNT"/>
    </Aggregations>
2 голосов
/ 29 октября 2010

Вы можете создать представление для этого списка с количеством элементов на странице, ограниченным до 10. Затем используйте элемент управления просмотра списка (вместо gridview) и связывайте представление.

2 голосов
/ 27 октября 2010

Это ограничение SharePoint.Вот почему SharePoint не показывает, сколько страниц вы видите.

1 голос
/ 29 ноября 2010

Просто потратил пару часов, пытаясь выяснить, как это сделать .... Ниже приведен список вещей, которые вам нужно сделать, чтобы получить полный список.

1) Изменить представление спискачто вы обращаетесь и в итоговых суммах добавьте COUNT в один из столбцов

2) Добавьте следующий код в запрос CAML в вашей веб-части

3) Добавьте следующий код для отображения счетчика

            <xsl:value-of select="/dsQueryResponse/Rows/Row/@*[name()='YOUR_COLUMN_NAME_FROM_FIRST_STEP.COUNT']"/>

И наслаждайтесь ... Я проверил это с фильтром и без него.

Art

0 голосов
/ 16 ноября 2016

Я нашел только "грязный" способ, который полностью вне всякой поддержки :) Я создал представление о базе данных и злоупотребил сервером SQL, чтобы рассчитывать на меня. Полностью сломанный и совершенно не поддерживаемый, и я собираюсь укусить себя, но единственный способ найти счет в большом количестве записей. Не использовал его, так как он небезопасен для производства.

Редактировать: все данные списка сбрасываются в одну огромную таблицу AllUserData, и если у вас есть tp_listid, вы можете создать счетчик

SELECT        COUNT(nvarchar7) AS Expr1
FROM          dbo.AllUserData
WHERE        (tp_ListId = 'xxxxxxxx-9999-3333-7777-yyyyyyyyyyyy')

Но тогда вы должны начать фильтрацию версий, если вы их используете

WHERE        (tp_Version =
             (SELECT        MAX(tp_Version) AS ex1
             FROM            {{view above}} AS V1
             WHERE        (key = M.key)))

и т. Д. И т. Д. Вы можете получить счет, и вы можете получить его очень быстро, но с пистолетом для пешеходов .....

0 голосов
/ 02 августа 2013

Возможно два решения, оба с ограничениями:

  • выполнить легкий запрос без заданных полей просмотра
  • использовать «неограниченный пейджер» (например, если вы используете DataGrid, установите VirtualItemCount в10K или выше)
0 голосов
/ 05 декабря 2011

Не знаю, находимся ли мы на той же странице ... но вы можете посчитать элементы, полученные SPQuery, довольно просто:

   SPQuery query = new SPQuery();
   query.Query = string.Concat(
                  "<Where><Eq>",
                     "<FieldRef Name='Status'/>",
                     "<Value Type='CHOICE'>Not Started</Value>",
                  "</Eq></Where>",
                  "<OrderBy>",
                     "<FieldRef Name='DueDate' Ascending='TRUE' />",
                     "<FieldRef Name=’Priority’ Ascending='TRUE' />", 
                  "</OrderBy>");                    


   SPListItemCollection items = list.GetItems(query);
   double totalCount = items.Count;

Может быть, это ваше решение.

...