Consulta Caml - pular X primeiros resultados
-
10-12-2019 - |
Pergunta
Vamos supor que eu tenha lista com 100 itens.É possível escrever consulta CAML para obter 5 itens, mas saltar 10 itens de início?Algo como LIMIT e OFFSET no SQL?
Solução
Infelizmente, o SharePoint paginação funciona um pouco diferente de LIMIT e OFFSET em SQL.Para obter paginado itens que você precisa fornecer o ID do primeiro item para a página que você deseja e, em seguida, defina RowLimit, e se você tiver a classificação definida para a lista, você também terá que fornecer colunas de ordenação de nomes e valores das colunas para o primeiro item na sua página.
Você pode ver como ele funciona se você for a qualquer lista que tenha itens e tente passar por páginas e ver como a seqüência de caracteres de consulta da página de mudanças.Em seguida, exclua alguns itens e tente novamente.Em seguida, alterar a ordem dos itens e tente novamente...
Todos os parâmetros que você vai ter que passar em ListItemCollectionPosition propriedade de SPQuery objeto.
Mais sobre a paginação do SharePoint:
http://www.directsharepoint.com/2011/03/step-by-step-guide-to-implement-paging.html
No seu caso específico, você pode simplificar um pouco as coisas, se você não tiver a filtragem e a classificação:
- Seleccione 11 primeiras Identificações da lista
- Utilize 11 de ID para criar o correto ListItemCollectionPosition para o seu SPQuery
- Conjunto RowLimit do SPQuery objeto para 5
Para selecionar rapidamente o top 11 IDs, use esta consulta:
var query = new SPQuery()
{
ViewFields = "ID",
ViewFieldsOnly = true,
IncludePermissions = false,
RowLimit = 11
};
Outras dicas
Pular n
itens não é possível, mas você pode executar uma consulta paginada, que significa que você pode definir um RowLimit
com um Order
e limitar os itens de resultado.O resultado foi um ListItemCollectionPosition
conjunto de propriedades que define onde a página seguinte começa.
Aqui você tem um C# CSOM exemplo:
int page = 2; // the desired page
string viewXml = $@"<View>
<Query>
<Where><Eq><FieldRef Name='FieldToFilter'/><Value Type='TypeOfField'>TheValue</Value></Eq></Where>
</Query>
<RowLimit>10</RowLimit> // Rowlimit is needed for paging, in your case to skip 10
<OrderBy>
<FieldRef Name='FieldToOrder' /> // In paged queries is advised to set an order
</OrderBy>
</View>";
using (ClientContext context = new ClientContext(YourUrl))
{
CamlQuery camlQuery = new CamlQuery
{
ViewXml = viewXml
};
List list = context.Web.Lists.GetById(ListGuid);
ListItemCollection items = null;
while (page > 0)
{
items = list.GetItems(camlQuery);
context.Load(items);
context.ExecuteQuery();
camlQuery.ListItemCollectionPosition = items.ListItemCollectionPosition;
page--;
}
items.ToList();
}
Esta consulta retorna item 11-20.
Eu não testá-lo em Javascript, mas tenho certeza de que se trabalha muito.