2010-01-21 13 views
1

J'ai une partie Web qui est 2-3 sous-sites sur le site de niveau supérieur. Je dois interroger la liste qui est dans la collection de site supérieure et un au même niveau, je suppose que c'est possible grâce à SPSiteDataquery ... J'ai une certaine confusion liée à ce que je peux écrire une seule requête qui peut interroger ces deux listes ....interrogation de partage de collection de sites entiers

La portée de cette requête est sitecollection de sorte que cela signifie qu'il va se pencher sur toute la liste dans la collection de sitecollection..et si ma requête CAML est la même pour ces deux listes ... cela devrait fonctionner?

laissez-moi vous expliquer par mon code:

SPSite mySite = SPControl.GetContextSite(Context); 
       SPWeb myWeb = SPControl.GetContextWeb(Context); 
       SPSiteDataQuery qry = new SPSiteDataQuery(); 
       qry.Lists = "<Lists BaseType='0' />"; 

       qry.Query = "<Where><Contains><FieldRef Name='Country'/><Value Type='Text'>" + strcount + "</Value></Contains></Where>"; 

       qry.ViewFields = "<FieldRef Name='Capital' Nullable='TRUE'/><FieldRef Name='Currency' Nullable='TRUE'/>"; 

       qry.Webs = "<Webs Scope='SiteCollection' />"; 

       DataTable dt = myWeb.GetSiteData(qry); 

i besoin maintenant monnaie de la liste qui est dans le site de niveau supérieur et le capital de la liste qui est au même niveau. Est-ce possible? ou j'ai mal compris SPSiteDataQuery ...?

+0

Quelles sont les colonnes de vos deux listes? Les colonnes des deux listes sont-elles les mêmes? –

Répondre

2

Vous êtes sur la bonne voie et il est possible de récupérer des résultats pour des listes dans différentes bandes. L'exemple suivant montre comment récupérer des éléments des listes par défaut 'Tâches' ou 'Tâches de flux de travail' et fonctionne avec les listes de tâches créées au niveau racine et dans un sous-site.

 SPSiteDataQuery q = new SPSiteDataQuery(); 
     q.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Priority'/><FieldRef Name='Status'/>"; 
     q.Webs = "<Webs Scope='SiteCollection' />"; 
     q.Lists = "<Lists BaseType='0' />"; 
     q.Query = "<Where><Gt><FieldRef Name='ID' /><Value Type='Number'>0</Value></Gt></Where>"; 

     DataTable results = new DataTable(); 

     using (SPSite site = new SPSite("http://sharepoint")) 
     { 
      using (SPWeb web = site.OpenWeb("subsite")) 
      {      
       results = web.GetSiteData(q); 
      } 
     } 

Je l'ai écrit en utilisant une URL hardcoded afin que vous puissiez l'exécuter dans une application de la console pour le test, mais vous pouvez remplacer les déclarations en utilisant quelque chose comme SPWeb web = SPContext.Current.Web; quand vous mettez cela à l'intérieur d'une partie web.

Quelques autres choses à considérer:

  • Les listes que vous interrogez doivent contenir tous les champs de l'élément ViewFields
  • champs multi-consultation ne fonctionnent pas bien avec la SPSiteDataQuery (valeur unique les champs de recherche sont corrects)
  • L'outil de création de CAML u2u est également utile pour tester les requêtes CAML. Voir http://www.u2u.be/Res/Tools/CamlQueryBuilder.aspx