SharePoint 2010: Trabajo con LINQ To SharePoint (III)!

Siguiendo con la serie de post relativos al soporte de LINQ en SharePoint 2010 a través de LINQ To SharePoint, en esta ocasión toca hablar de como podemos hacer Joins entre listas relacionales (a través de campos de Lookup) en SharePoint 2010. Pero antes de empezar, os dejo una referencia a los dos post previos de la serie sobre LINQ To SharePoint:

Soporte de Joins en SharePoint 2010

SharePoint 2010 permite relacionar listas, sin llegar a un status de asegurar integridad referencial, a través de los campos de Lookup y además habilita el que podamos definir consultas en las que se especifiquen Joins entre las listas relacionadas de forma similar a como lo podemos hacer al trabajar con tablas relacionadas en SQL Server. Para ello, Microsoft ha actualizado el esquema CAML de consultas de listas para añadir el soporte de Joins. Con respecto a este soporte, os resumo alguna de las características:

  • En principio no hay límite en el número de Joins que se pueda hacer, aunque aviso a navegantes: no todas las consultas que queramos van a hacer posibles ya que SharePoint analiza la eficiencia de las consultas antes de su ejecución. Si la consulta a realizar es ineficiente, se producirá la correspondiente excepción.
  • Los Joins los podemos hacer a nivel de CAML o a nivel de LINQ To SharePoint. La opción recomendada es esta última ya que sí el CAML que podíamos construir en SharePoint 2007 tenía su complejidad, al añadir Joins a SharePoint 2010 la definición se complica aún más.
  • Como consecuencia de poder realizar Joins, podremos devolver campos de las listas relacionadas. Los campos relativos a la lista padre se denominan campos proyectados.

Creando Joins en LINQ To SharePoint

Para probar el soporte de Joins en SharePoint 2010, he creado en primer lugar una lista padre denominada Empresa en la que he añadido un par de columnas adicionales a la lista para a continuación añadir un par de valores. A continuación:

  • He creado una lista Empleados en la que uno de los campos de la lista es de tipo Lookup. Este campo obtiene información de la lista Empresa y además lo he configurado para que se visualicen otros dos campos de información de esta lista.
  • A continuación he añadido una serie de datos a la lista Empleados.
image image image

Una vez creadas las listas, me he ido a Visual Studio 2010 dónde:

  • He creado un proyecto para .NET Framework 3.5 de tipo Aplicación de Consola.
  • He cambiado la plataforma por defecto de x86 a Any CPU (habría sido suficiente con x64) ya que es un requerimiento necesario para poder trabajar con el modelo de objetos de SharePoint 2010.
  • He añadido dos referencias al proyecto a Microsoft.SharePoint y Microsoft.SharePoint.Linq.
  • A continuación, desde la línea de comandos y utilizando SPMetal he generado la clase proxy correspondiente para poder trabajar con las Listas y Bibliotecas del sitio de trabajo utilizando LINQ To SharePoint.
  • No todos los tipos de campos de SharePoint 2010 permiten definir Joins. Por ejemplo, los campos de tipo texto enriquecido no se pueden utilizar para definir Joins entre listas ni como campos proyectados.
image image
  • Tras añadir las correspondientes directivas using a Microsoft.SharePoint y Microsoft.SharePoint.Linq, el código necesario para consultar datos de las listas relacionadas es el siguiente:

                    string sSiteUrl = http://pegaso;

                SPLINQProxySiteDataContext ctx =

                    new SPLINQProxySiteDataContext(sSiteUrl);

                var ListaEmpleados =

                    from e in ctx.Empleados

                        select new{

                        Nombre=e.Nombre,

                        Empresa = e.Organizacion.Title,

                        SedeEmpresa = e.Organizacion.Sede,

                        PlantillaEmpresa=e.Organizacion.Plantilla

                        };  

                ctx.Log=Console.Out;  

                foreach (var e in ListaEmpleados)

                {

                    Console.WriteLine(

                        “{0} – {1} – {2} – {3}”,

                        e.Nombre, e.Empresa, e.SedeEmpresa, e.PlantillaEmpresa);

                }

                Console.ReadLine();

  • Como veis:
    • En primer lugar se crea el objeto DataContext que se encarga de recoger las consultas LINQ y traducirlas al correspondiente CAML que se envía al servidor.
    • A continuación defino la consulta en la que van a aparecer los Joins. En este caso, estos aparecen en el Select ya que estoy especificando que quiero consultar tres campos de información (campos proyectados) relativos a la lista padre.
    • Una vez definida la consulta, con la línea ctx.Log = Console.Out se volcará la consulta CAML generada tan pronto como esta se ejecute.
    • Para ejecutar la consulta, simplemente iteramos a través del correspondiente bucle Foreach.
  • Tras compilar y comprbar que no hay errores, ejecutamos la aplicación de consola de manera que:
    • En primer lugar vemos la consulta CAML generada. Fijaros como aparecen los Joins y los campos proyectados que se han definido en la consulta.
    • A continuación de la consulta CAML se muestran los resultados obtenidos a partir de la ejecución de la consulta.
image image

Por supuesto, otra consulta posible es hacer lo mismo y añadir algún tipo de filtro de manera que en el CAML generado aparece la condición Where correspondiente:

                    string sSiteUrl = http://pegaso;

                SPLINQProxySiteDataContext ctx =

                    new SPLINQProxySiteDataContext(sSiteUrl);

                var ListaEmpleados =

                    from e in ctx.Empleados

                        where e.Organizacion.Sede=“Santander” 

                        select new{

                        Nombre=e.Nombre,

                        Empresa = e.Organizacion.Title,

                        SedeEmpresa = e.Organizacion.Sede,

                       PlantillaEmpresa=e.Organizacion.Plantilla

                        };  

                ctx.Log=Console.Out;  

                foreach (var e in ListaEmpleados)

                {

                    Console.WriteLine(

                        “{0} – {1} – {2} – {3}”,

                        e.Nombre, e.Empresa, e.SedeEmpresa, e.PlantillaEmpresa);

                }

                Console.ReadLine(); 

 Los resultados obtenidos en este caso son los siguientes:

image image

Y hasta aquí llega este tercer post sobre LINQ To SharePoint. 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.

Deja un comentario

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