Sie müssen SPQuery in einer einzigen Dokumentbibliothek in alle Dokumentenbibliotheken der Website in SPSitedataquery konvertieren

StackOverflow https://stackoverflow.com/questions/1126337

  •  13-09-2019
  •  | 
  •  

Frage

Ich brauche Hilfe beim Konvertieren des folgenden Code -Snippets, um sptitedataquery anstelle von spquery b/c zu verwenden. Ich muss alle Dokumentbibliotheken auf der Website abfragen.

Hier ist der ursprüngliche Code:

using (SPWeb oWeb = new SPSite(properties.SiteId).OpenWeb(properties.RelativeWebUrl))
                {
                    SPList oList = oWeb.Lists["Quality Documents"];

                    //create query
                    SPQuery oQuery = new SPQuery();

                    //configure the query  //
                    oQuery.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";

                    //get the collection of items in the list
                    SPListItemCollection oItems = oList.GetItems(oQuery);

                    if (oItems.Count > 0)
                    {
                        newRnd = 0;
                    }
                    else
                    {
                        newRnd = 1;
                    }
                }

Und hier ist, was ich für die sptitedataQuery habe, aber ich weiß nicht, ob es richtig ist und/oder wie der Code dasselbe wie der obige Code tut.

SPSiteDataQuery q = new SPSiteDataQuery();
q.Lists = "<Lists BaseType='1'/>";
q.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";
q.Webs = "<Webs Scope='SiteCollection' />";
q.ViewFields = "<FieldRef Name='Document_x0020_Number' />"';
q.RowLimit = 1;
War es hilfreich?

Lösung

Der Hauptunterschied zwischen Spquery und Sptitedataquery ist in der Angabe der Liste der Abfragen. Anders als bei SpQuery können Sie in sptitedataQuery keinen Listentitel angeben, um Ihre Abfrage auf jeder Website einzugrenzen. Sie verfügen nur über das Listenelement, das viel weniger flexibel ist. Vincent Rothwell beschreibt Alle Möglichkeiten hier.

Diese Inflexibilität bedeutet, dass die Verwendung von BaseType = 1 in Ihrem Listen -Elementcode Dokumente aus allen Dokumentbibliotheken zurückgibt. Sie können dies nur vermeiden, wenn Sie eine benutzerdefinierte Listenvorlage für die Vorlage für Quality Documents mit seiner eigenen ID -Nummer. Sie würden dann in der Lage sein, zu verwenden <Lists ServerTemplate='XYZ' /> (wobei XYZ die ID -Nummer ist, um die Ergebnisse auf diese Art von Listentyp einzugrenzen). Andernfalls müssen Sie die Ergebnisse filtern, die Sie zurückerhalten, damit sie nur Einträge von der enthalten Quality Documents Bibliothek.

Abgesehen davon sieht Ihr Code gleichwertig aus. Sie können sich auch gerne ansehen CrossListQueryInfo und CrosslistQuerycache Wenn Sie Moos laufen. Diese ermöglichen es Ihnen, Abfragen im Stil von Spededitedataquery im Stil zu leiten. Sehen Dieser Beitrag von Jeff Dalton Für gute Informationen dazu.

Aktualisieren von Kommentaren zur Objektentsorgung:

Ihr Code läuft das Sp -Site -Objekt - dies erfordert auch eine Verwendung von Klausel. Ersetzen Sie die Verwendung der Leitung, die Sie derzeit durch diese Zeilen haben:

using (SPSite oSite = new SPSite(properties.SiteId))
using (SPWeb oWeb = oSite.OpenWeb(properties.RelativeWebUrl))
{
    // Your code
}

Außerdem ist es einfach, SPDisposecheck zu verwenden. Um sich in Visual Studio zu integrieren, fügen Sie das Post -Build -Event Ihres Projekts die folgende Zeile hinzu:

"%Programmfile% microsoft SharePoint entsorgen spDisposecheck.exe" $ (TargetPath)

Der Build schlägt jetzt fehl, wenn Sie Speicherlecks haben. Überprüfen Sie das Ausgangsfenster für Details darüber, wo sie sich befinden. Beachten Sie, dass SPDispoScheck manchmal falsch positive Ergebnisse berichtet und es möglich ist, diese zu ignorieren (lesen Sie die Dokumentation, um Ihnen mitzuteilen, wie).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top