SPSiteDataQuery que belleza!

Hay ocasiones donde requerimos realizar consultas internas de información que van más allá de consultar una simple lista o biblioteca de documentos en un mismo nivel de sitio. SPSiteDataQuery es una belleza disponible en el modelo de objetos de SharePoint v3 que nos permite realizar búsquedas de información entre múltiples listas y sitios de una misma colección de sitios. La clase SPQuery realiza la consulta a un solo nivel de un sitio y regresa una colección de tipo SPListItemCollection sin embargo, SPSiteDataQuery puede realizar la misma consulta en los distintos subsitios y listas de una misma colección de sitios regresando el resultado en una sola respuesta y por si fuera poco, en un objeto de tipo DataTable de ADO.NET. 

Veamos el siguiente código:

SPSiteDataQuery q = new SPSiteDataQuery();
q.ViewFields = “<FieldRef Name=’columna1′ /><FieldRef Name=’columna2′ />”; // campos que queremos obtener
q.Lists = “<Lists BaseType=’1’/>”; // tipo de objeto donde queremos buscar. GenericList = 0, DocumentLibrary = 1, DiscussionForum = 3, VoteOfSurvey = 4, IssueList = 5
q.Webs = “<Webs Scope=’SiteCollection’ />”; // alcance de la busqueda
q.Query = “<Where><Eq><FieldRef Name=’columna3′ /><Value Type=’Text’>xxx</Value></Eq></Where>”; // query CAML

DataTable dt = null;
using (SPSite s = new SPSite(siteUrl))
{
SPWeb w = s.OpenWeb();
dt = w.GetSiteData(q);
w = null;
}

foreach (DataRow dr in dt.Rows)
{
var1 = Convert.ToInt32(dr[“columna1”].ToString());
var2 = Convert.ToInt32(dr[1].ToString());
}
 

Una recomendacion final es no abusar de SPSiteDataQuery para realizar todo tipo de consultas, 
recuerda que SPSiteDataQuery realiza la consulta en toda una coleccion de sitio, si solamente 
requieres buscar sobre un mismo nivel de sitio es mucho mas recomendable utiliza SPQuery.

Publicado por

haarongonzalez

Consultor de tecnología de la información dedicado a entregar soluciones de misión crítica para organizaciones donde la colaboración, la comunicación y el conocimiento son su inversión estratégica. Reconocido como Microsoft Most Valuable Professional en ASP / ASP.NET desde 2005 y SharePoint Server desde 2009. Interés: Satisfacción del Cliente, Excelencia Operacional, Desarrollo de Personas, Ingeniería en Pre-Ventas Especialidades: Colaboración, Gestión de Contenidos Web, Gestión del Conocimiento, Gestión de Contenidos Empresariales, Gestión de Formularios, Intranet, Extranet, Portales, Implementaciones de entornos on-premises de SharePoint, Arquitectura de soluciones, Soporte Especializado en SharePoint y Office 365 Tecnologías: SharePoint todas las versiones, Office 365, Nintex, DocuSign, Sharegate, PowerApps, Flow, SPDocKit, InfoPath, .NET, C #, JavaScript, CSS, Skeleton Framework, Office 365 PnP

2 thoughts on “SPSiteDataQuery que belleza!”

  1. Con “columna1”, “columna2” se ve bien. Pero después en aplicaciones reales he tenido que poner en los ViewFields los GUIDS pertenecientes a determinadas columnas lo cual destroza la mantenibilidad. Y porque GUIDS? porque tenia listas en sitios y subsitios de estos y tenia que traer los campos “nombre”, “apellido”, “descripcion”.. pero claro, como esos nombres eran comunes en otras listas tuve que especificar un GUID.

    Una posible solucion del SPSiteDataQuery sería que tenga la posibilidad de filtrar por una o varias listas por nombre.. algo asi como: ““;

    A mi me pareció uno de los peores objetos dentro de sharepoint, y más si despues uno ve que todos los items de las listas están en una sola tabla de la BD.. no se cómo le dicen por allá, creo que es “un cañon para matar mosquitos”.

    Saludos.

  2. Si claro, a mi me ha funcionado para ciertos escenarios sencillos por supuesto, en ocasiones esta belleza se convierte en una verdadera bruja por eso hay que usarlo con cuidado.

    Saludos

Deja un comentario

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