necessario convertire SPQuery su una singola raccolta documenti per SPSiteDataQuery su tutte le raccolte documenti nel sito

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

  •  13-09-2019
  •  | 
  •  

Domanda

Ho bisogno di aiuto convertendo il seguente frammento di codice da utilizzare al posto di SPSiteDataQuery SPQuery b / c ho bisogno di interrogare attraversato tutta Raccolte documenti nel sito.

Ecco il codice originale:

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;
                    }
                }

Ed ecco quello che ho per la SPSiteDataQuery, ma non so se è corretto e / o il modo per assicurarsi che il codice fa la stessa cosa come il codice di cui sopra.

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;
È stato utile?

Soluzione

La differenza principale tra SPQuery e < a href = "http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.aspx" rel = "nofollow noreferrer"> SPSiteDataQuery è nello specificare l'elenco da interrogare. A differenza di SPQuery, in SPSiteDataQuery non è possibile specificare il titolo della lista per restringere la query in ogni sito, si ha solo l'elemento Le liste, che è molto meno flessibile. Vincent Rothwell descrive tutte le possibilità qui .

Questa mancanza di flessibilità significa che l'uso di BaseType = 1 nel codice Liste elemento restituirà i documenti da tutte le librerie di documenti. L'unico modo è possibile evitare questo è che se è stato distribuito un modello di elenco personalizzato per Quality Documents con un proprio numero identificativo. Si sarebbe quindi in grado di utilizzare <Lists ServerTemplate='XYZ' /> (dove XYZ è il numero ID per restringere i risultati verso il basso per quel tipo di lista). In caso contrario, è necessario filtrare i risultati che si ottengono indietro in modo che contengono solo le voci dalla libreria Quality Documents.

Oltre a questo il codice sia equivalente. È possibile, come anche a guardare CrossListQueryInfo e CrossListQueryCache se si esegue MOSS. Questi consentono di memorizzare nella cache le query in stile SPSiteDataQuery. Vedere questo post da Jeff Dalton per una buona informazione su questo.

Aggiornamento da commenti su disposizione oggetto:

Il codice perderà l'oggetto SPSite - questo ha bisogno di una clausola utilizzando pure. Sostituire la riga utilizzando attualmente si dispone con queste righe:

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

Inoltre, è facile da usare SPDisposeCheck. Per l'integrazione con Visual Studio aggiungere la seguente riga alla post evento di compilazione del progetto:

  

"% Programmi% \ Microsoft \ SharePoint   Smaltire Controllare \ SPDisposeCheck.exe"   $ (TargetPath)

La costruzione sarà ora riuscire se si dispone di perdite di memoria. Controllare la finestra di uscita per i dettagli su dove sono. Si noti che a volte SPDisposeCheck riporta falsi positivi ed è possibile ignorare questi (leggere la documentazione di dirvi come).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top