Sometimes, it is necessary to retrieve an item given its ID (unique identifier). There is always the SPWeb.GetFile(Guid itemGuid) method, but that does not return an item if that item exists in a sub site. The sub site may be a level down or two or ‘n’ levels down.
Using SPWeb.GetSiteData, it is much easier to query for the Item anywhere from your root web.
Below is the code snippet:
SPSiteDataQuery oQuery = new SPSiteDataQuery();
oQuery.Lists = "<Lists BaseType='1'/>";
oQuery.RowLimit = 100;
oQuery.Webs = "<Webs Scope=\"Recursive\" />";
queryBuilder.Append("<Where><Eq><FieldRef Name=\"UniqueId\" />");
queryBuilder.Append("<Value Type=\"Lookup\">");
queryBuilder.Append("e5d483ac-1c4a-4699-bcd1-dd0bb0455a71");
queryBuilder.Append("</Value></Eq></Where>");
oQuery.Query = queryBuilder.ToString();
DataTable dtResult = web.GetSiteData(oQuery);
if (dtResult.Rows.Count > 0)
{
foreach (DataRow row in dtResult.Rows)
{
string listId=row[0].ToString();
string webId=row[1].ToString();
string itemId = row[2].ToString();
}
}
There is also the SPSite.GetSiteData method if you want to use. If you are planning to use the CrossListQueryCache class, then make sure you read this blog entry!