Récupérer un composant à partir de sous-dossiers à l'exclusion de certains sous-dossiers


4

J'ai un dossier qui contient des sous-dossiers et des composants.

Par exemple, le nom du dossier principal comme 030 Main, qui a sous-dossiers,:

  • 100 mango
  • 120 apple
  • 150 cake
  • archive
  • not used
  • trash

Il y a aussi quelques composants dans 030 Main.

Maintenant, je veux récupérer uniquement les composants qui utilise un schéma spécifique de certains sous-dossiers (en gras ci-dessus):

  • 100 mango
  • 120 apple
  • 150 cake

Je n'ai pas besoin de composants de archive, not used, ou trash ni les composants dans 030 Main.

J'ai essayé quelque chose comme ci-dessous, d'abord avec un filtre sur la structure du dossier (je suis tcm id de archive, not used, 100 mango, 120 apple, 150 cake et trash). Puis j'ai vérifié si l'ID de tcm du dossier correspond à 100 mango, 120 apple ou 150 cake.

Si cette condition est vraie, j'utilise un filtre de composants pour obtenir tous les composants avec le schéma spécifié.

Mais ici var id je reçois toujours les composants présents dans archive, not used, trash.

S'il vous plaît suggérer mai être la deuxième partie de filtrage ne fonctionne pas.

OrganizationalItemItemsFilterData filter = new OrganizationalItemItemsFilterData 
      { 
       ItemTypes = new[] { ItemType.Folder }, 
       Recursive = true, 
       BaseColumns = ListBaseColumns.Id 
      }; 

     foreach (var id in client.GetListXml(folderUri, filter).Elements().ToList()) 
     { 
      string so = id.Attribute("ID").Value; 
      Console.WriteLine(so); 
      if ((so == "tcm:229-38695-2") || (so == "tcm:229-149861-2")||(so == "tcm:229-149940-2")||(so =="tcm:229-149941-2")||(so == "tcm:229-149942-2")||(so =="tcm:229-149943-2")||(so =="tcm:229-149875-2")) 
      { 
       Console.WriteLine("i m in"); 
       OrganizationalItemItemsFilterData filter1 = new OrganizationalItemItemsFilterData(); 
       filter1.ItemTypes = new ItemType[] { ItemType.Component }; 
       filter1.ComponentTypes = new ComponentType[] { ComponentType.Normal }; 
       filter1.Recursive = true; 

       StringBuilder sb = new StringBuilder(); 
       string QuestionTitle = string.Empty; 
       foreach (var idin in client.GetListXml(folderUri, filter1).Elements().ToList()) 
       { 
        string compSchema = idin.Attribute("SchemaId").Value; 
        string compId = idin.Attribute("ID").Value; 
4

La ligne sur le code - var idin in client.GetListXml(folderUri, filter1) semble incorrect car il devrait être var idin in client.GetListXml(so, filter1) à mon avis, aucun sens à votre if clause

  0

Il semble également que la condition OR soit mise pour tous les sous-dossiers, bien que les composants ne soient accessibles qu'à partir de trois d'entre eux (en fonction du nombre de vérifications). 28 déc.. 152015-12-28 15:07:15

  0

Pankaj Merci, ça marche. Et merci à tous pour votre précieux temps. 29 déc.. 152015-12-29 06:00:05

  0

Si cela fonctionne, cela vous dérangerait-il de l'accepter comme une réponse à l'amélioration du site Web. En outre, ce serait génial si vous pensez que la réponse est bonne pour un upvote 29 déc.. 152015-12-29 06:35:31


6

Je suggère d'utiliser une approche différente avec l'API Recherche requête à partir le service principal. Eric Huiza a écrit un excellent article sur un exemple de récupération de composants en utilisant un schéma spécifique. http://erichuiza.blogspot.bg/2012/06/performing-search-queries-with-core.html

En outre, il est possible de passer un paramètre « Searchin », comme indiqué dans cette réponse, Search in multiple folders via core service?

Dans l'ensemble ce code devrait fonctionner plus rapidement et aussi plus flexible. Vous pourriez toujours avoir besoin d'appliquer un filtre de post-recherche, comme dans votre code ci-dessus, si vous n'êtes pas en mesure de tout filtrer par la requête de recherche.