Problems with the SPSiteDataQuery and Content Type Name
Last week a colleague and I were working on a solution to find items by its content type within a site collection using the SPSiteDataQuery.
When we moved the solution to the testing environment we discovered that the solution was only returning results that were in a single list.
the code we used was the following:
SPSiteDataQuery query = new SPSiteDataQuery();
query.Webs = "<Webs Scope=\"Recursive\">";
//Ask for all lists created from the contacts template.
query.Lists = "<Lists BaseType='1' MaxListsLimit='0'/>";
// Get the Title (Last Name) and FirstName fields.
query.ViewFields = "<FieldRef Name=\"Dossiername\" />";
query.ViewFields += @"<FieldRef Name='Dossiernumber'/>";
query.ViewFields += @"<FieldRef Name='ContentType'/>";
string where = "<Where><Eq>";
where += "<FieldRef ID='ContentType' />";
where += "<Value Type='Computed'>Dossier</Value>";
where += "</Eq></Where>";
query.Query = where;
DataTable results = web.GetSiteData(query);
foreach (DataRow row in results.Rows){
Console.WriteLine("{0} -- {1} -- {2}", row["ContentType"], row["Dossiername"], row["Dossiernumber"]);
}
So this code only returns the items from 1 list. You can solve this problem by searching on the content type id, instead of the content type name. Like the code below:
SPSiteDataQuery query = new SPSiteDataQuery();
query.Webs = "<Webs Scope=\"Recursive\">";
query.Lists = "<Lists BaseType='1' MaxListsLimit='0'/>";
query.ViewFields = "<FieldRef Name=\"Dossiername\" />";
query.ViewFields += @"<FieldRef Name='Dossiernumber'/>";
query.ViewFields += @"<FieldRef Name='ContentType'/>";
SPContentType cTypeCollection = web.ContentTypes["Dossier"];
string where = string.Format(
@"<Where>
<BeginsWith>
<FieldRef Name='ContentTypeId'/>
<Value Type='Text'>{0}</Value>
</BeginsWith>
</Where>", cTypeCollection.Id);
// Set the query string.
query.Query = where;
DataTable results = web.GetSiteData(query);
foreach (DataRow row in results.Rows){
Console.WriteLine("{0} -- {1} -- {2}", row["ContentType"], row["Dossiername"], row["Dossiernumber"]);
}