lunes, 18 de mayo de 2015

Extendiendo Linq en SharePoint 2010

Esto sera un breve manual de como extender de manera adecuada nuestra clase Linq generada con la herramienta SPMETA.EXE.


Me paso que nunca había utilizado Linq en SharePoint para mis desarrollos hasta que mi hermano me comento que esta tecnología era de lo mejor así que decidí intentarlo.

La situación fue la siguiente, se requiere disponer de una lista SharePoint en un webpart para poder generar un Slider. De manera que es necesario recuperar desde SharePoint la imagen y los textos asociados.

Comenzaremos con la lista SharePoint que guardara nuestros elementos.

La estructura de la lista es la siguiente:




Adicionalmente se utilizara una imagen que sera incrustada (attach) de manera nativa al elemento de lista.


Generando clase SPLinq.cs con SPMETAL.EXE

Este pequeño script que lo pueden guardar en la raíz de su proyecto en Visual Studio en mi caso se llama "GeneraSPLinq.bat"


@ECHO OFF

echo Generando SPLInq.cs

echo ************************************************

cd C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN

SPMetal.exe /web:http://de-moss2010-wfe:18013/ /code:C:\Users\victor.gaete.MOPTT\Desktop\PROYECTO_CNA\Proyecto_CNA\Proyecto_CNA\SPLinq.cs

echo ************************************************

echo SPLinq.cs generado

pause

El resultado de ejecutar este bat es la generacionde SPLinq.cs




Posteriormente esta clase SPLinq.cs debe ser agregada a Visual Studio.

Se debe tener en cuenta cuando se trabaje que hay que incorporar las siguentes referencias para el buen funcionamiento de la clase.



using Microsoft.SharePoint.Linq;

using Microsoft.SharePoint;

using System.Linq;


Utilizando SPLinq.cs



Una vez tenemos bien referenciada nuestras dependencias y la clase incorporada al proyecto podemos hacer la siguiente llamada para acceder a la lista.



SPLinqDataContext dc = new SPLinqDataContext(SPContext.Current.Web.Url);

EntityList<SliderInicioItem> SliderInicioItem = dc.GetList<SliderInicioItem>("SliderInicio");

            var sliderQuery = from slider in SliderInicioItem

                              select new

                              {

                                  slider.Id,

                                  slider.Title,

                                  slider.Subtitulo,

                                  slider.TextoPortada,
                              };

Hasta aquí, es ideal puesto que rapidamente recuperamos

  • Id
  • Title
  • Subtitulo
  • TextoPortada
¿Pero que pasa con la imagen?

Lamentablemente SPMETAL.EXE no es capas de generar un modelo que traiga datos mas complejos, es por esto que debemos extender nuestra clase linq para poder agregar de una manera transparente los campos que deseemos trabajar.


Extendiendo

Lo primero es crear una clase en nuestro Visual Studio con un nombre relativo a nuestra extencion, por ejemplo "SliderInicioExt" .


Se debe tener especial cuidado en este paso, al momento de crear la clase  se debe extender de la clase SliderInicioItem e implementar la interfaz ICustomMapping que es la que permite la extención del contexto de LINQ.

public partial class SliderInicioExt:SliderInicioItem,ICustomMapping


La interfaz implementa tres métodos MapFrom, MapTo y Resolve, en este caso revisaremos solo MapFrom, quedara para otra publicación MapTo y Resolve.

Finalmente la clase debería quedar como en el siguiente código:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.Linq; using Microsoft.SharePoint; using miproyecto.miwebpart; namespace miproyecto {     public partial class SliderInicioExt:SliderInicioItem,ICustomMapping     {         public void MapFrom(object listItem)         { throw new NotImplementedException();         }         public void MapTo(object listItem)         {             throw new NotImplementedException();         }         public void Resolve(RefreshMode mode, object originalListItem, object databaseListItem)         {             throw new NotImplementedException();         }     } }



MapFrom


Nuestro objetivo es recuperar el archivo incrustado o attachment del ememento de la lista, para ello vamos a declarar las siguientes variables en nuestra clase



        public SPAttachmentCollection Attachment { get; set; }



        [CustomMapping(Columns = new String[] { "*" })]

        public void MapFrom(object listItem)

        {

            SPListItem item = (SPListItem)listItem;

            this.Attachment = item.Attachments;

        }

Definimos Attachment de tipo SPAttachmentCollection como la propiedad que vamos a agregar a nuestro objeto.

Definimos el valor type[] que es un array de string que identifica el content type a la cual estamos haciendo referencia, en nuestro caso es * que representa a todos content type y todas las propiedades del SPListItem.

[CustomMapping(Columns = new String[] { "*" })]

Lo siguiente es modificar nuestro metodo MapFrom que es implementado por la interfaz ICustomMapping


             SPListItem item = (SPListItem)listItem;

             this.Attachment = item.Attachments;

De esta manera ya podemos tener acceso de la siguiente forma a nuestro objeto Attachment:


SPLinqDataContext dc = new SPLinqDataContext(SPContext.Current.Web.Url);

EntityList<SliderInicioExt> SliderInicio = dc.GetList<SliderInicioExt>("SliderInicio");



            var sliderQuery = from slider in SliderInicio

                              select new

                              {

                                  slider.Id,

                                  slider.Title,

                                  slider.Subtitulo,

                                  slider.TextoPortada,

                                  slider.Attachment

                              };

A partir de este punto ya podemos trabajar con sliderQuery de la manera tradicional recorriendo el Attachment recordando que es un SPAttachmentCollection.



foreach (var x in sliderQuery)

            {
                SPAttachmentCollection attachmentcollection = x.Attachment;

                foreach (string filename in attachmentcollection)

                {
                    string url = attachmentcollection.UrlPrefix + filename;

                   ** SU CODIGO**
                }
            }


Espero que les sirva tanto como a mi, cualquier consulta o pregunta pueden hacerla por este medio.
Saludos






See you space cowboy...

No hay comentarios.:

Publicar un comentario