Procedimiento para recuperar elementos de lista

Última modificación: viernes, 29 de abril de 2011

Hace referencia a: SharePoint Foundation 2010

En este artículo
Recuperación de elementos de una lista
Uso del método Include
Recuperación de campos específicos de una cantidad especificada de elementos
Recuperación de elementos de todas las listas de un sitio web
Recuperación de elementos mediante una posición de colección de elementos de lista

Disponible en SharePoint Online

Para devolver elementos de una lista, use el método GetItemById() (JavaScript: getItemById(id)) para devolver un solo elemento o el método GetItems(CamlQuery) (JavaScript: getItems(query)) para devolver varios elementos. Posteriormente, debe usar el método Load<T>(T, []) (JavaScript: load(clientObject)) para alcanzar los objetos de elemento de lista que representan los elementos.

Recuperación de elementos de una lista

El método GetItems(CamlQuery) (JavaScript: getItems(query)) permite definir una consulta Lenguaje de marcado de aplicaciones de colaboración (CAML) que especifique qué elementos se van a devolver. Puede pasar un objeto CamlQuery no definido (JavaScript: CamlQuery) para devolver todos los elementos de la lista, o bien usar la propiedad ViewXml (JavaScript: viewXml) para definir una consulta CAML y devolver los elementos que cumplan con criterios específicos.

En el siguiente ejemplo se muestran los valores de columna Identificador, Título y Cuerpo de los primeros 100 elementos de la lista Anuncios, comenzando por los elementos de lista cuyo identificador de colección es mayor que 10.

using System;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class RetrieveListItems
    {
        static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            SP.List oList = clientContext.Web.Lists.GetByTitle("Announcements");

            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = "<View><Query><Where><Geq><FieldRef Name='ID'/>" +
                "<Value Type='Number'>10</Value></Geq></Where></Query><RowLimit>100</RowLimit></View>";
            ListItemCollection collListItem = oList.GetItems(camlQuery);

            clientContext.Load(collListItem);

            clientContext.ExecuteQuery();

            foreach (ListItem oListItem in collListItem)
            {
                Console.WriteLine("ID: {0} \nTitle: {1} \nBody: {2}", oListItem.Id, oListItem["Title"], oListItem["Body"]);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint.Client
Imports SP = Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class RetrieveListItems

        Shared Sub Main ()

            Dim siteUrl As String = "http://MyServer/sites/MySiteCollection"

            Dim clientContext As New ClientContext(siteUrl)
            Dim oList As SP.List = clientContext.Web.Lists.GetByTitle("Announcements")

            Dim camlQuery As New CamlQuery()
            camlQuery.ViewXml = "<View><Query><Where><Geq><FieldRef Name='ID'/>" + _
                "<Value Type='Number'>10</Value></Geq></Where></Query><RowLimit>100</RowLimit></View>"

            Dim collListItem As ListItemCollection = oList.GetItems(camlQuery)

            clientContext.Load(collListItem)

            clientContext.ExecuteQuery()

            Dim oListItem As ListItem
            For Each oListItem In collListItem
                Console.WriteLine("ID: {0} " + ControlChars.Lf + "Title: {1} " + _
                                  ControlChars.Lf + "Body: {2}", oListItem.Id, _
                                  oListItem("Title"), oListItem("Body"))
            Next oListItem

        End Sub
    End Class
End Namespace
var siteUrl = '/sites/MySiteCollection';

function retrieveListItems() {

    var clientContext = new SP.ClientContext(siteUrl);
    var oList = clientContext.get_web().get_lists().getByTitle('Announcements');
        
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' + 
        '<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>10</RowLimit></View>');
    this.collListItem = oList.getItems(camlQuery);
        
    clientContext.load(collListItem);
        
    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));        
        
}

function onQuerySucceeded(sender, args) {

    var listItemInfo = '';

    var listItemEnumerator = collListItem.getEnumerator();
        
    while (listItemEnumerator.moveNext()) {
        var oListItem = listItemEnumerator.get_current();
        listItemInfo += '\nID: ' + oListItem.get_id() + 
            '\nTitle: ' + oListItem.get_item('Title') + 
            '\nBody: ' + oListItem.get_item('Body');
    }

    alert(listItemInfo.toString());
}

function onQueryFailed(sender, args) {

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}

En el ejemplo anterior se carga la colección de elementos especificados por la consulta CAML y, posteriormente, se puede obtener acceso a todas las propiedades predeterminadas en cada objeto de elemento de lista que se devuelve. Use el método Include<TSource>(IQueryable<TSource>, []) para mejorar el rendimiento mediante la limitación de la cantidad de datos que se devuelven por medio de la consulta al especificar qué propiedades se encuentran disponibles. En ECMAScript (JavaScript, JScript), especifique la instrucción Include como parte de la cadena de consulta que se pasa al método load(clientObject)).

Uso del método Include

Existen cuatro propiedades de ListItem (JavaScript: ListItem) que no están disponibles de forma predeterminada al devolver elementos de lista: DisplayName (JavaScript: displayName), EffectiveBasePermissions (JavaScript: effectiveBasePermissions), HasUniqueRoleAssignments (JavaScript: hasUniqueRoleAssignments) y RoleAssignments (JavaScript: roleAssignments). El ejemplo anterior devuelve PropertyOrFieldNotInitializedException si desea obtener acceso a una de estas propiedades. Para obtener acceso a ellas, use el método Include<TSource>(IQueryable<TSource>, []) en una expresión de consulta LINQ para devolverlas explícitamente. En ECMAScript (JavaScript, JScript), especifique Include como parte de la cadena de consulta. Para obtener más información acerca de las propiedades no predeterminadas, vea Introducción a la recuperación de datos.

Para modificar el ejemplo anterior para que devuelva el valor de DisplayName (JavaScript: displayName) y HasUniqueRoleAssignments (JavaScript: hasUniqueRoleAssignments), puede reemplazar la llamada anterior al método Load<T>(T, []) (JavaScript: load(clientObject)) por una llamada que use una consulta LINQ, que en C# requiere una referencia al espacio de nombres System.Linq. En ECMAScript (JavaScript, JScript), especifique Include.

Nota

Al usar LINQ para crear consultas en el modelo de objetos de cliente, usa LINQ to Objects en lugar del proveedor LINQ to SharePoint, que sólo puede usarse al escribir código en el modelo de objetos de servidor.

using System;
using System.Linq;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class RetrieveListItemsInclude
    {
        static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            SP.List oList = clientContext.Web.Lists.GetByTitle("Announcements");

            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = "<View><RowLimit>100</RowLimit></View>";

            ListItemCollection collListItem = oList.GetItems(camlQuery);

            clientContext.Load(collListItem,
                 items => items.Include(
                    item => item.Id,
                    item => item.DisplayName,
                    item => item.HasUniqueRoleAssignments));

            clientContext.ExecuteQuery();

            foreach (ListItem oListItem in collListItem)
            {
                Console.WriteLine("ID: {0} \nDisplay name: {1} \nUnique role assignments: {2}",
                    oListItem.Id, oListItem.DisplayName, oListItem.HasUniqueRoleAssignments);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint.Client
Imports SP = Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class RetrieveListItemsInclude

        Shared Sub Main ()

            Dim siteUrl As String = "http://MyServer/sites/MySiteCollection"

            Dim clientContext As New ClientContext(siteUrl)
            Dim oList As List = clientContext.Web.Lists.GetByTitle("Announcements")

            Dim camlQuery As New CamlQuery()
            camlQuery.ViewXml = "<View><RowLimit>100</RowLimit></View>"

            Dim collListItem As ListItemCollection = oList.GetItems(camlQuery)

            clientContext.Load(collListItem, _
                Function(items) items.Include( _
                    Function(item) item.Id, _
                    Function(item) item.DisplayName, _
                    Function(item) item.HasUniqueRoleAssignments))


            clientContext.ExecuteQuery()

            Dim oListItem As ListItem
            For Each oListItem In collListItem
                Console.WriteLine("ID: {0} " + ControlChars.Lf + _
                                  "Display name: {1} " + ControlChars.Lf + _
                                  "Unique role assignments: {2}", oListItem.Id, _
                                  oListItem.DisplayName, oListItem.HasUniqueRoleAssignments)
            Next oListItem

        End Sub
    End Class
End Namespace
var siteUrl = '/sites/MySiteCollection';

function retrieveListItemsInclude() {

    var clientContext = new SP.ClientContext(siteUrl);
    var oList = clientContext.get_web().get_lists().getByTitle('Announcements');

    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml('<View><RowLimit>100</RowLimit></View>');
    this.collListItem = oList.getItems(camlQuery);

    clientContext.load(collListItem, 'Include(Id, DisplayName, HasUniqueRoleAssignments)');

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}

function onQuerySucceeded(sender, args) {

    var listItemInfo = '';
    var listItemEnumerator = collListItem.getEnumerator();
        
    while (listItemEnumerator.moveNext()) {
        var oListItem = listItemEnumerator.get_current();
        listItemInfo += '\nID: ' + oListItem.get_id() + 
            '\nDisplay name: ' + oListItem.get_displayName() + 
            '\nUnique role assignments: ' + oListItem.get_hasUniqueRoleAssignments();
    }

    alert(listItemInfo.toString());
}

function onQueryFailed(sender, args) {

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}

Dado que en este ejemplo se usa el método Include<TSource>(IQueryable<TSource>, []) (en ECMAScript (JavaScript, JScript), Include), sólo las propiedades especificadas estarán disponibles después de la ejecución de la consulta. Por lo tanto, recibirá PropertyOrFieldNotInitializedException si intenta obtener acceso a otras propiedades además de las que se especificaron. Además, recibirá este error si intenta usar propiedades como ContentType (JavaScript: contentType) o ParentList (JavaScript: parentList) para obtener acceso a las propiedades de los objetos que contienen.

Recuperación de campos específicos de una cantidad especificada de elementos

En el siguiente ejemplo se muestra cómo recuperar campos específicos únicamente de los primeros cinco elementos de una lista. Dado que solo se especificaron las columnas Título y Cuerpo, estas son las únicas propiedades disponibles.

using System;
using System.Linq;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class RetrieveSpecificItemsFields
    {
        static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            SP.List oList = clientContext.Web.Lists.GetByTitle("Announcements");

            CamlQuery camlQuery = new CamlQuery();
            ListItemCollection collListItem = oList.GetItems(camlQuery);

            clientContext.Load(
                collListItem,
                items => items.Take(5).Include(
                item => item["Title"],
                item => item["Body"]));

            clientContext.ExecuteQuery();

            foreach (ListItem oListItem in collListItem)
            {
                Console.WriteLine("Title: {0} \nBody: {1}\n", oListItem["Title"], oListItem["Body"]);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint.Client
Imports SP = Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class RetrieveSpecificItemsFields

        Shared Sub Main ()

            Dim siteUrl As String = "http://MyServer/sites/MySiteCollection"

            Dim clientContext As New ClientContext(siteUrl)
            Dim oList As SP.List = clientContext.Web.Lists.GetByTitle("Announcements")

            Dim camlQuery As New CamlQuery()
            Dim collListItem As ListItemCollection = oList.GetItems(camlQuery)

            clientContext.Load(collListItem, _
                Function(items) items.Take(5).Include( _
                    Function(item) item("Title"), _
                    Function(item) item("Body")))

            clientContext.ExecuteQuery()

            Dim oListItem As ListItem
            For Each oListItem In collListItem
                Console.WriteLine("Title: {0} " + ControlChars.Lf + "Body: {1}" + _
                                  ControlChars.Lf, oListItem("Title"), oListItem("Body"))
            Next oListItem

        End Sub
    End Class
End Namespace

El ejemplo anterior pasa el objeto CamlQuery al método Load<T>(T, []) sin especificar una cadena de consulta CAML, que normalmente devolvería todos los elementos de lista, pero en este caso el método Take<TSource>(IQueryable<TSource>, Int32) limita la cantidad de elementos que se devuelven.

Nota

El método load(clientObject) del modelo de objetos de JavaScript en Microsoft SharePoint Foundation 2010 no admite el uso del método Take<TSource>(IQueryable<TSource>, Int32) que se usa en el ejemplo anterior.

Recuperación de elementos de todas las listas de un sitio web

En el siguiente ejemplo se muestra cómo recuperar los títulos de los primeros 10 elementos de todas las listas de un sitio web.

using System;
using System.Linq;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class RetrieveFirstTenItemsAllLists
    {
        static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            ListCollection collList = clientContext.Web.Lists;

            clientContext.Load(
                collList,
                lists => lists.Where(
                    list => list.Hidden == false).Include(
                    list => list.Title,
                    list => list.Items.Take(10)));

            clientContext.ExecuteQuery();

            foreach (SP.List oList in clientContext.Web.Lists)
            {
                string listTitle = oList.Title;
                int itemCount = oList.Items.Count;

                Console.WriteLine("List {0} returned with {1} items", listTitle, itemCount);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint.Client
Imports SP = Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class RetrieveFirstTenItemsAllLists

        Shared Sub Main ()

            Dim siteUrl As String = "http://MyServer/sites/MySiteCollection"

            Dim clientContext As New ClientContext(siteUrl)
            Dim collList As ListCollection = clientContext.Web.Lists

            clientContext.Load(collList, _
                Function(lists) lists.Where( _
                    Function(list) list.Hidden = False).Include( _
                        Function(list) list.Title, _
                        Function(list) list.Items.Take(10)))

            clientContext.ExecuteQuery()

            Dim oList As SP.List
            For Each oList In clientContext.Web.Lists
                Dim listTitle As String = oList.Title
                Dim itemCount As Integer = oList.Items.Count

                Console.WriteLine("List {0} returned with {1} items", listTitle, itemCount)
            Next oList

        End Sub
    End Class
End Namespace

Nota

En SharePoint Foundation 2010, el método load(clientObject) de JavaScript no admite el uso del método Where<TSource>(IQueryable<TSource>, Expression<Func<TSource, Boolean>>) que se usa en el ejemplo anterior.

Recuperación de elementos mediante una posición de colección de elementos de lista

Puede usar la clase ListItemCollectionPosition para implementar la recuperación de elementos de lista de pagicación de acuerdo con la posición de los elementos relativa a su colección. Use el elemento RowLimit para especificar la cantidad de elementos que se van a devolver por página. El siguiente ejemplo se repetirá en todos los elementos de una lista Anuncios, mediante la propiedad ListItemCollectionPosition de la clase CamlQuery y la propiedad ListItemCollectionPosition de la clase ListItemCollection, para ejecutar los comandos get o set alternativamente la posición de cada iteración en una colección, conforme a cinco elementos por página. Siempre y cuando sea true que se han devuelto cinco elementos para una página, el bucle continuará y usará la propiedad PagingInfo para mostrar la información de la paginación, junto con información acerca de cada uno de los cinco elementos devueltos. Cuando se devuelven menos de cinco elementos para una página, el bucle se detiene.

using System;
using System.Linq;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class UsingItemCollectionPosition
    {
        static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            SP.List oList = clientContext.Web.Lists.GetByTitle("Announcements");

            ListItemCollectionPosition itemPosition = null;

            while (true)
            {
                CamlQuery camlQuery = new CamlQuery();

                camlQuery.ListItemCollectionPosition = itemPosition;

                camlQuery.ViewXml = "<View><ViewFields><FieldRef Name='ID'/>" + 
                    "<FieldRef Name='Title'/><FieldRef Name='Body'/>" + 
                    "</ViewFields><RowLimit>5</RowLimit></View>";

                ListItemCollection collListItem = oList.GetItems(camlQuery);

                clientContext.Load(collListItem);

                clientContext.ExecuteQuery();

                itemPosition = collListItem.ListItemCollectionPosition;

                foreach (ListItem oListItem in collListItem)
                {
                    Console.WriteLine("Title: {0}: \nBody: {1}", oListItem["Title"], oListItem["Body"]);
                }

                if (itemPosition == null)
                {
                    break;
                }

                Console.WriteLine("\n" + itemPosition.PagingInfo + "\n");
            }
        }

    }
}
Imports System
Imports Microsoft.SharePoint.Client
Imports SP = Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class UsingItemCollectionPosition

        Shared Sub Main ()

            Dim siteUrl As String = "http://MyServer/sites/MySiteCollection"

            Dim clientContext As New ClientContext(siteUrl)
            Dim oList As SP.List = clientContext.Web.Lists.GetByTitle("Announcements")

            Dim itemPosition As ListItemCollectionPosition = Nothing

            While True

                Dim camlQuery As New CamlQuery()
                camlQuery.ListItemCollectionPosition = itemPosition

                camlQuery.ViewXml = "<View><ViewFields><FieldRef Name='ID'/>" + _
                    "<FieldRef Name='Title'/><FieldRef Name='Body'/>" + _
                    "</ViewFields><RowLimit>5</RowLimit></View>"

                Dim collListItem As ListItemCollection = oList.GetItems(camlQuery)

                clientContext.Load(collListItem)

                clientContext.ExecuteQuery()

                itemPosition = collListItem.ListItemCollectionPosition

                Dim oListItem As ListItem
                For Each oListItem In collListItem
                    Console.WriteLine("Title: {0}: " + ControlChars.Lf + _
                        "Body: {1}", oListItem("Title"), oListItem("Body"))
                Next oListItem

                If itemPosition Is Nothing Then
                    Exit While
                End If

                Console.WriteLine((ControlChars.Lf + itemPosition.PagingInfo + ControlChars.Lf))
            End While

        End Sub
    End Class
End Namespace

Para obtener información y ejemplos acerca de la recuperación de objetos de cliente dentro del contexto del modelo de objetos de SharePoint Foundation Silverlight, vea Uso del modelo de objetos Silverlight.

Vea también

Conceptos

Introducción a la recuperación de datos

Instrucciones del modelo de objetos cliente

Procedimiento para crear, actualizar y eliminar elementos de lista

Tareas comunes de programación

Otros recursos

Fragmento de código: obtención de datos de elemento de una lista externa en el cliente

Biblioteca de clases de cliente

Biblioteca de clases de ECMAScript