SPSiteDataQuery – Query-Felder müssen in ViewFields vorhanden sein

[Sarkasmus an]
Migrationsprojekte sind doch was schönes …
[Sarkasmus aus]

Ich habe gerade ein Migrationsprojekt bei dem mehrere SharePoint 2007 SiteCollection auf einen neuen SharePoint 2010 Server umgesiedelt werden. Klar, dass ein paar Sachen an den Solutions, Features, Masterpages, Page Layouts, usw. angepasst werden müssen. Aber Änderungen an einem SPSiteDataQuery ? Davor war ich nicht gewarnt!

SPException was caught
at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
at Microsoft.SharePoint.Library.SPRequest.CrossListQuery(String bstrUrl, String bstrXmlWebs, String bstrXmlLists, String bstrXmlQuery, ISP2DSafeArrayWriter pCallback, Object& pvarColumns)
at Microsoft.SharePoint.SPWeb.GetSiteData(SPSiteDataQuery query)

Das ist der Fehler der mir unter SharePoint 2010 ausgegeben wurde!
Nicht gerade sehr vielsagend.

Also Quellcode durchwühlen …

var sdQueryNewsPages = new SPSiteDataQuery()
{
	Lists = "<Lists ServerTemplate="850" />",
	ViewFields = "<FieldRef Name="ContentType" Nullable="TRUE" /><FieldRef Name="ArticleStartDate" Nullable="TRUE" /><FieldRef Name="Title" Nullable="TRUE" /><FieldRef Name="FileRef" Nullable="TRUE" />",
	Webs = "<Webs Scope="Recursive" />",
	Query = "<Where><Eq><FieldRef Name='ContentType' /><Value Type='Choice'>Nachrichtenseite</Value></Eq></Where><OrderBy><FieldRef Name='ArticleStartDate' Ascending='false' /><FieldRef Name='Created' Ascending='false' /></OrderBy>"
}

Dieser Code funktionierte in SharePoint 2007 wunderbar.
Ich habe den Code mit PowerShell nachgebaut und die verschiedensten Kombinationen ausprobiert bis ich den genauen Grund gefunden habe weswegen es in SharePoint 2010 nicht funktioniert.

Die Lösung:
In SharePoint 2007 war es möglich in der Query-Property Felder anzugeben, die nicht in den ViewFields vorhanden sein müssen (warum auch immer). Genau das traf hier zu.
Bei meinem Problem fehlte das Feld Created in den ViewFields.

var sdQueryNewsPages = new SPSiteDataQuery()
{
	Lists = "<Lists ServerTemplate="850" />",
	ViewFields = "<FieldRef Name="Created" Nullable="TRUE" /><FieldRef Name="ContentType" Nullable="TRUE" /><FieldRef Name="ArticleStartDate" Nullable="TRUE" /><FieldRef Name="Title" Nullable="TRUE" /><FieldRef Name="FileRef" Nullable="TRUE" />",
	Webs = "<Webs Scope="Recursive" />",
	Query = "<Where><Eq><FieldRef Name='ContentType' /><Value Type='Choice'>Nachrichtenseite</Value></Eq></Where><OrderBy><FieldRef Name='ArticleStartDate' Ascending='false' /><FieldRef Name='Created' Ascending='false' /></OrderBy>"
}

Diese Hürde wäre dann fürs erste geschafft.
Ich bin auch schon auf mein erstes Migrationprojekt von SharePoint 2010 auf SharePoint 2013 gespannt. Mal schauen was sich Microsoft in SharePoint 2013 ausgedacht hat um mich zu ärgern. 😀

91 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.