SharePoint y LINQ (I)!

Recientemente en uno de los proyectos en los que estamos trabajando surgió la necesidad de consultar datos de una lista de SharePoint y mostrarlos ordenados en base a uno de los campos de la misma. La primera alternativa en la que pensamos para solventar esta necesidad fue la de CAML, pero entre medias también pensamos que LINQ era otra opción interesante. La primeras preguntas que nos surgieron aquí fueron ¿cómo está la integración de SharePoint y LINQ?, ¿puedo consultar datos de una lista de SharePoint mediante LINQ? La respuesta a al primera pregunta es que “más o menos”, mientras que la respuesta a la segunda es que sí…y ahora os explicaré los motivos de estas respuestas. A la hora de consultar datos de SharePoint, tenemos dos alternativas:

  • Usar LINQ To SharePoint, que es una extensión de LINQ que traduce consultas LINQ a consultas CAML en SharePoint. El problema de esta extensión es que parece que está descontinuada, puesto que desde la versión alfa de noviembre de 2008 no ha habido nuevas versiones.
  • Aprovecharnos la potencia que nos la clase List<T> que nos permitirá construir un objeto consultable mediante LINQ a partir de los elementos de una lista de SharePoint (que  no es consultable mediante LINQ).

En este post os voy a mostrar el segundo punto y como superar algunas limitaciones a trabajar con objetos de tipo List<SPListItem>. Lo pasos iniciales que he seguido son los siguientes:

  • Añadir unos datos de prueba a una lista tipo Links de SharePoint.
  • Crear un proyecto de aplicación de consola de Visual Studio 2008.
  • Añadir la referencia a Windows SharePoint Services 3.0.
image image image
  • En el código de la aplicación de consola, añadiremos las referencias necesarias para poder utilizar objetos de SharePoint por un lado, así como colecciones genéricas por otro.

//Espacios de nombres necesarios

using Microsoft.SharePoint;

using System.Collections.Generic;

  • A continuación añadimos el código necesario para poder realizar la consulta a la lista de SharePoint:
    • Creamos una instancia de un objeto SPSite a partir de la url de nuestro sitio SharePoint.
    • A partir del objeto SPSite, creamos una instancia de un objeto SPWeb.
    • A partir del objeto SPWeb, creamos una instancia de un objeto SPList especificando además que sea la lista Links.
    • Definimos un objeto de tipo List<SPListItem> que si permite consultas con LINQ.
    • Añadimos elementos al objeto List<SPListItem> recorriéndonos la lista origen.
    • Realizamos una consulta LINQ.
    • Mostramos el resultado ejecutando la consulta con un foreach (recordar que LINQ aplica evaluación diferida de consultas).

            //Acceso al sitio de SharePoint

            SPSite spsSite = new SPSite(“http://win-amr7ey1djky/”);

            SPWeb spwWeb = spsSite.OpenWeb();

            SPList splList = spwWeb.Lists[“Links”];

 

            //Construimos un objeto que se pueda consultar con LONQ           

            List<SPListItem> lItems = new List<SPListItem>();

            foreach (SPListItem splItem in splList.Items)

            {

                lItems.Add(splItem);

            }

 

            //Consulta LINQ

            var LinqQuery = from l in lItems

                            orderby l.Title

                            select l;

 

            //Visualizamos los resultados

            Console.WriteLine(“***************Resultado Consulta LINQ # 1***************”);

            foreach (var l in LinqQuery)

            {

                Console.WriteLine(l.Name);

 

            }         

 

            Console.ReadLine();

  • Sin más, mostramos el resultado:

image

Pero, no todo es tan bonito como parece…si os fijáis en el código, únicamente estoy mostrando la propiedad Name de la lista. ¿Se pueden mostrar más propiedades de la lista? La respuesta es que sí, pero no todas…esto lo he podido comprobar gracias al intellisense de Visual Studio. Por ejemplo, para esta lista no se muestra información como el usuario creador del ítem, la fecha de modificación, etc.

image

Entonces, ¿mi gozo en un pozo? La respuesta es que sí y que no…sí, porque no tengo accesibles todas las propiedades de manera indirecta, pero no porque si las tengo accesibles indirectamente gracias a que el objeto que almacena el resultado de la consulta LINQ ofrece una propiedad Xml en la que tenemos todos los campos de la lista de SharePoint…absolutamente todos. El código para comprobarlo es el siguiente:

            Console.WriteLine(“***************Resultado Consulta LINQ # 2***************”);

            foreach (var l in LinqQuery)

            {

                Console.WriteLine(l.Xml);

 

            }

            Console.ReadLine();

Y el resultado que se visualiza por pantalla es:

image

Por lo tanto, tengo toda la información de cada ítem de la lista…en formato Xml, pero esto es tratable…con lo que lo tengo todo. Y hasta aquí llega este post sobre SharePoint y LINQ. Espero que os haya resultado interesante.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

5 comentarios en “SharePoint y LINQ (I)!”

  1. Hola, Juan Carlos!

    Las propiedades que tienes accesibles son, claro, las propiedades que ofrece la clase SPListItem, ninguna culpa de LINQ ahí…

    Puedes sacar el creador, etc. de la propiedad Xml con LINQ to XML, que me imagino es de lo que va la segunda parte del post 🙂

    Saludos – Octavio

  2. Hola Octavio y Diego,
    Gracias por el comentario, no le echaba la culpa a LINQ, sino que me había hecho a la idea de que tendría más campos accesibles y que permitiría hacer algo parecio a lo que tenemos con CAML…Diego, respecto a la forma de tratar los datos de la propiedad Xml, lo más fácil es hacerlo como dice Octavio con LINQ To XML…otra alternativa sería XPath…y fuera de tener que tratar el XML, se podrían leer los campos de cada ListItem utilizando algo parecido a lo que hice en su momento en este post:

    http://geeks.ms/blogs/ciin/archive/2007/05/22/wss-3-0-moss-copiando-datos-entre-listas-utilizando-un-workflow.aspx

    Un saludo

    JC’s

  3. Muy instructivo, gracias:) Un pequeño descuido: “puesto que desde la versión alfa de noviembre de 2008 no ha habido nuevas versiones.” entiendo que te refieres a noviembre del 2007 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *