Пейджинг в 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/