Frage

Ich suche nach den besten Abfragen nach Standortdaten innerhalb einer Site -Sammlung. Ich muss alle Listen entweder in einem bestimmten SPWEB oder für eine Reihe von SPWebs, die einen bestimmten Inhaltstyp enthalten, abfragen. Das Projekt, an dem ich arbeite, verwendet derzeit Code wie folgt:

private void EnumerateChildWebs(SPWeb web, bool firstTime) {  
   if (!firstTime) {
      EnumerateListCol(web.Lists);
   }

   foreach (SPWeb child in web.Webs) {
      EnumerateChildWebs(child, false);
      child.Dispose();
   }
}

private void EnumerateListCol(SPListCollection spListCol) {
   SPList            list;
   SPContentTypeId   ctid;

   for (int i = 0; i < spListCol.Count; i++) {
      list = spListCol[i];

      if (list.ContentTypesEnabled && list.BaseType == SPBaseType.DocumentLibrary) {

         foreach (SPContentType ct in list.ContentTypes) {

            // [Omitted] - Code to check if the list contains a particular content type

            if (ct.ID matches the one we're looking for) {
               // Do something with the list
               break;
            }
         }
      }
   }
}

Meine Frage ist, wäre es im Allgemeinen besser, um dies zu tun, um dies zu tun? Es scheint, als würde es viel sauberer Code ergeben, aber was ist mit der Leistung? Gibt es eine konventionelle Weisheit, wann man sptitedataQuery verwendet wird? Ich habe einige Informationen dazu im Web gelesen, aber nichts, was mein spezielles Szenario anspricht.

War es hilfreich?

Lösung

Dies ist ein wirklich interessantes Szenario (und eines, das ich mir neulich angesehen habe), da die API für diesen Fall nicht viel unterstützt hat - die meisten Methoden geht es um die Aggregationsliste Artikel anstatt sich selbst aufzulisten. Wenn Sie versuchen, sptitedataQuery oder einen der ähnlichen Ansätze (z. B. CrossListQuerycache) zu verwenden Artikel, Aus dem, von dem Sie dann die übergeordneten Listen ableiten würden - ob dies effizienter wäre als Ihr vorhandener Ansatz, wird wahrscheinlich darauf zurückzuführen, wie viele Listenelemente in diesen "Zwischen" -Entratmengen abgefragt/abgerufen werden.

Wenn Sie sich diesen Ansatz ansehen, ist das Suchen von Elementen, bei denen der ContentTyped mit der entsprechenden ID für die entsprechende Site -Inhaltstyp beginnt, die zu verwendende Abfrage.

Der Code, den ich neulich geschrieben habe, war nicht der Produktionscode, aber ich bin mir zu 99% sicher, dass ich zum gleichen Ergebnis wie Sie angekommen bin. Ob sptitedataQuery oder ähnliches eine bessere Leistung liefern würde, kann nur durch das Testen in unseren jeweiligen Websites nachgewiesen werden, da die Anzahl der Listen/Anzahl der Listenelemente/indexierten Spalten usw. alle Faktoren wären, die einen großen Einfluss haben würden. Die <10 -Listen mit jeweils <10 Elementen unterscheiden sich eindeutig sehr von 1000 Listen mit jeweils 100.000 Elementen.

PS als allgemeine Referenz zu Aggregationstechniken, das Folgende ist interessantes Lesen:

Andere Tipps

Ich bin mir nicht sicher, ob es hier anwendbar ist, aber auf der DVWP -Seite gibt es eine DataSourcemode = "ListoFlists", die zurückgegeben wird, Sie haben es erraten, eine Liste von Listen. Die Webdienste haben analoge Funktionen mit dem Lists.GetListCollection -Methode. Ich würde davon ausgehen, dass Sie, da diese beiden Ebenen es Ihnen ermöglichen, auf Informationen über Listen zuzugreifen, ohne sich deren Elemente zu untersuchen, dass die API ähnliche Funktionen liefern würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top