by Piotrosz
17. May 2010
SPSiteDataQuery pozwala na odpytywanie wielu list w obrębie SPSite (czyli kolekcji witryn).
Mogą to być wszystkie listy określonego typu (wtedy trzeba podać
ID danego typu listy) lub listy o podanych Guidach.
Zapytanie takie w przeciwieństwie do
SPQuery zwraca DataTable, a nie SPListItemCollection.
Zwracana DataTable ma dodatkowe kolumny o nazwach "WebID" - guid witryny i "ListID" - guid listy.
Przykład:
using System;
using Microsoft.SharePoint;
using System.Data;
namespace SPSiteDataQueryTest
{
class Program
{
static void Main()
{
SPSiteDataQuery q = new SPSiteDataQuery();
q.Lists = "<Lists>" +
"<List ID='{03195192-B3EB-4BD0-BD6E-B9A11DAE896E}' />" +
"<List ID='{DA6BBEC6-6478-4887-BF35-A27015B27626}' />" +
"</Lists>";
q.Query = "<Where>" +
"<Contains>" +
"<FieldRef Name='Body'/>" +
"<Value Type='Text'>Ala ma kota</Value>" +
"</Contains>" +
"</Where>";
q.ViewFields = "<FieldRef Name='Title'/>" +
"<FieldRef Name='Body'/>";
q.RowLimit = 10;
q.Webs = "<Webs Scope=\"SiteCollection\" />";
using (SPSite site = new SPSite("http://test"))
{
using (SPWeb web = site.OpenWeb())
{
DataTable dt = web.GetSiteData(q);
foreach (DataRow row in dt.Rows)
{
Console.WriteLine("WebId: {0}", row["WebID"]);
Console.WriteLine("ListID: {0}", row["ListID"]);
Console.WriteLine("Title: {0}", row["Title"]);
Console.WriteLine("Body: {0}", row["Body"]);
Console.WriteLine();
}
}
}
}
}
}
Wynik:
Tutaj jest bardzo dobry przykład takiego zapytania.