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?

Foi útil?

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:

  1. Seleccione 11 primeiras Identificações da lista
  2. Utilize 11 de ID para criar o correto ListItemCollectionPosition para o seu SPQuery
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top