Mejoras en el manejo de listas con LINQ To SharePoint
SharePoint 2010: Evolución Vs RevoluciónMario Cortés [email protected]://blogs.renacimiento.com/mcortes
Consultor SharePoint en RenacimientoCoordinador SUGES
Coautor de:
Agenda
LINQ to SharePointRelaciones entre listasSPMetalModificación de datosPost-Deployment Extension LINQ To SharePoint fuera de SharePoint!!Limitaciones y rendimiento
LINQ To SharePoint
Permite manejar las listas de SharePoint desde clases de .NETLas listas se convierten en entidades y las columnas en propiedadesSe implementa con Microsoft.SharePoint.Linq
var clientesDeMadrid = from customer in Customers where customer.City == "Madrid" select customer;
Antes y Después
Hasta ahora Beneficios con LINQ
Las consultas CAML son complejasPropenso a erroresRealizar consultas cruzadas es complejoMejor rendimiento
Sintaxis de consultas más naturalLos datos están fuertemente tipadosEs sencillo realizar consultas cruzadas
SPList listaDeFacturas = SPContext.Current.Web.Lists["Facturas"];SPQuery spQuery = new SPQuery();spQuery.Query = string.Format(@"<Where> <Eq>
<FieldRef Name='{0}' LookupId='TRUE'/><Value Type='Lookup'>1</Value>
</Eq> </Where>", listaDeFacturas.Fields["Cliente"].InternalName);
GridView1.DataSource = listaDeFacturas.GetItems(spQuery);GridView1.DataBind();
ClientesDataContext dxClientes = new ClientesDataContext("http://win-u6irsic8d95/sitios/linq/");
var listaFacturas = from facturas in dxClientes.Facturas where facturas.Cliente.CIF == "11111111H" select new {
facturas.Id, facturas.Título, NombreCliente = facturas.Cliente.Título, facturas.Cliente.Ciudad };
GridView1.DataSource = listaFacturas; GridView1.DataBind();
LINQ To SharePoint (2)
Las consultas LINQ se transforman en consultas CAMLPodemos seguir trabajando con CAML
Se han ampliado las clases: SPQuerySPSiteDataQuery
Para construir las entidades de LINQ se utiliza el ejecutable SPMetal
Relaciones entre listas
Las relaciones entre listas se construyen mediante columnas de tipo LookupLas columnas Lookup se han mejorado incorporando:
Integridad referencial entre listasProjected fieldsPosibilidad de hacer JOINS
Consideraciones de seguridad
Joins
Se ha modificado CAML para soportar JOINS aunque es más fácil hacerlo desde LINQPara hacer un JOIN es necesario que al menos una de las columnas sea del tipo Lookup
var listaFacturas = from facturas in dxClientes.Facturas join clientes in dxClientes.Clientes on facturas.Cliente.Id equals clientes.Id select new {
facturas.Id, facturas.Título, NombreCliente = clientes.Título};
SPMetal
Construye las entidades y el contexto de LINQ to SharePoint a partir de la estructura de un sitioSe encuentra en “…\14\bin\SPMetal.exe”Admite un fichero XML para personalizar la generación
SPMETAL.EXE /web:http://win-u6irsic8d95/sitios/linq /namespace:Clientes /code:SPClientes.cs
Modificación de datos
Se puede realizar acciones de edición, nuevo y borradoAconsejable hacer un solo SubmitChanges para todos los cambiosMantiene un control de concurrencia, por defecto optimistaSe puede extender la modificación para agregar nuestra propia funcionalidad
Post-Deployment Extension
Extiende la estructura de las listas sin recompilar el assembly original mediante ICustomMappingPodemos mapear nuevas columnas a nuevas propiedadesManeja conflictos producidos en las nuevas columnas
LINQToSP fuera de SharePoint!!
LINQ To SharePoint puede ejecutarse fuera del contexto del servidor (Client Side Code)
Data Services, utiliza la dll Microsoft.SharPoint.Linq.DataservicesMO cliente, mediante LINQ to Object
Limitaciones y rendimiento
Cualquier consulta que pueda traducirse directamente a CAML es eficienteAlgunas operaciones de LINQ no están soportadas
FacturasDocumento factura = dxClientes.Facturas.First(f => f.Cliente.CIF == "11111111H");
FacturasDocumento factura = dxClientes.Facturas. ToList<FacturasDocumento>().First(
f => f.Cliente.CIF == "11111111H");
Ineficiente
Eficiente
Limitaciones y rendimiento (2)
Más eficiente si desactivamos el trackingMáximo de 6 projected fields en joinLímite en el número de elementos devueltos:
Usuario normal: 5.000 elementosSuperusuario: 20.000 elementos
Gracias !!!
Mario Cortés [email protected] http://blogs.renacimiento.com/mcortes
©2009 Microsoft, Microsoft Dynamics, the Office logo, and Your potential. Our passion. are trademarks of the Microsoft group of companies. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.