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.