Пейджинг в SharePoint с помощью SPSiteDataQuery

Я пытаюсь написать WebPart для SharePoint, который будет отображать список последних загрузок и изменений на сайте (включая все списки документов)

Для этого я создал SPGridView и использую SPSiteDataQuery, чтобы заполнить его моими (настраиваемыми) выбранными списками. Я знаю, что SPQuery имеет ListItemCollectionPosition, но, насколько мне известно, это не будет работать для нескольких списков, и выполнение по одному разрушает сортировку / разбиение по страницам.

Это фрагмент того, что у меня есть:

Dim query As New SPQuery()
Dim lists As String = "<Lists ServerTemplate='101'>"
For Each li As Guid In SelectedLists ' Personalisable Property
    lists &= "<List ID='" & li.ToString & "' />"
Next
lists &= "</Lists>"

query.Lists = lists
query.RowLimit = 30 ' This will be the page size and is temporarily hardcoded

' These Id's are all SPBuildInFieldId's converted ToString
query.ViewFields = "<FieldRef ID'" & _filenameId & "' />" &
   "<FieldRef ID='" & _modifiedId & "' />" &
   "<FieldRef ID='" & _modifiedById & "' />" &
   "<FieldRef ID='" & _versionId & "' />" &
   "<FieldRef ID='" & _checkedOutToId & "' />" &
   "<FieldRef ID='" & _fileSizeId & "' />" &
   "<FieldRef ID='" & _createdId & "' />" &
   "<FieldRef ID='" & _createdById & "' />"

query.Webs = "<Webs Scope='Recursive' />"
query.Query = "<OrderBy><FieldRef ID='" & _modifiedId & "' Ascending='FALSE' /></OrderBy>"

Dim temp as DataTable = objWeb.GetSiteData(query)
For Each row As DataRow In temp.Rows
    Dim aRow = dtTable.Rows.Add()

    ' Get List Information
    Dim listId As Guid = New Guid(row.Item("ListId").ToString)
    Dim thisList As SPList = objWeb.Lists(listId)

    Dim fileName As String = row.Item(_filenameId).ToString
    aRow.Item("DocIcon") = "/_layouts/15/images/" & Utilities.SPUtility.MapToIcon(objWeb, fileName, "")
    aRow.Item("FileName") =  fileName
    aRow.Item("FileLink") = objWeb.Url & "/" & thisList.Title & "/" & fileName
    aRow.Item("ListName") = thisList.Title
    aRow.Item("ListLink") = objWeb.Url & "/" & thisList.Title
    aRow.Item("Modified") = row.Item(_modifiedId).ToString
    aRow.Item("ModifiedBy") = New SPFieldLookupValue(row.Item(_modifiedById).ToString).LookupValue
    aRow.Item("Version") = row.Item(_versionId).ToString
    aRow.Item("CheckedOutTo") = New SPFieldLookupValue(row.Item(_checkedOutId).ToString).LookupValue
    aRow.Item("FileSize") = row.Item(_fileSizeId).ToString
    aRow.Item("Created") = row.Item(_createdId).ToString
    aRow.Item("Author") = New SPFieldLookupValue(row.Item(_createdById).ToString).LookupValue
Next

Этот DataTable установлен в качестве источника моего SPGridView, и это позволяет выполнять подкачку страниц (в настоящее время я использую SPGridViewPager), но он всегда будет возвращать полную коллекцию документов из запроса, что приведет к некоторым накладным расходам, если их много документов.

Я хотел бы иметь возможность разбивать на страницы в самом запросе, чтобы он возвращал только правильные документы для текущей страницы (~30 за раз), но я пытаюсь добиться этого.

Есть ли какое-то решение, которое мне не хватает, которое позволило бы мне запрашивать заранее определенный набор списков в измененном порядке, а также разбивать их на страницы во время запроса?

Заранее спасибо и извиняюсь за неправильную формулировку / форматирование, это мой первый вопрос на этом сайте.

1 ответ

В этом случае есть обходной путь, хотя он может и не быть "лучшим выбором", если у вас большой объем данных.

"Представьте себе, если мы хотим отобразить 25 записей на странице, а пользователь хочет перейти на страницу № 2.

uint recordsPerPage = 25;

uint pageNumber = 2;

Поэтому свойство rowLimit нашего запроса должно быть 25 * 2 = 50. "

https://nivas07.wordpress.com/2010/06/15/paging-using-spsitedataquery/

Другие вопросы по тегам