Извлечение компонента из подпапок, за исключением некоторых подпапок


4

У меня есть папка с подпапками и компонентами.

Например, Main имя папки в 030 Main, который имеет вложенные папки с именами:

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

Есть также некоторые компоненты в 030 Main.

Теперь я хочу, чтобы получать только те компоненты, которые используют заданную схему из определенных подкаталогов (в жирного выше):

  • 100 mango
  • 120 apple
  • 150 cake

Мне не нужны какие-либо компоненты из archive, not used, или trash, а также компоненты в пределах 030 Main.

Я пытался что-то вроде ниже, сначала с фильтром на структуру папок (я получил ТСМ корочки archive, not used, 100 mango, 120 apple, 150 cake и trash).

Затем я проверил, соответствует ли идентификатор tcm папки 100 mango, 120 apple, или 150 cake.

Если это условие истинно, я использую фильтр компонентов, чтобы получить все компоненты с указанной схемой.

Но вот в var id я все еще получаю компоненты, присутствующие в archive, not used, trash.

Возможно, вторая фильтрующая часть не работает.

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

Линия по коду - var idin in client.GetListXml(folderUri, filter1) выглядит неправильно, как это должно быть var idin in client.GetListXml(so, filter1) на мой взгляд, чтобы сделать какой-либо смысл вашей статьи if

  0

Также кажется, что условие ИЛИ задано для всех подпапок, хотя к компонентам необходимо получить доступ только из трех (гадание по количеству проверок). 28 дек. 152015-12-28 15:07:15

  0

Pankaj Спасибо, он работает. И спасибо всем за ваше драгоценное время. 29 дек. 152015-12-29 06:00:05

  0

Если это сработает, не могли бы вы принять его в качестве ответа на улучшение веб-сайта. Кроме того, было бы здорово, если бы вы считали, что ответ хорош для повышения 29 дек. 152015-12-29 06:35:31


6

Я хотел бы предложить использовать другой подход с API поисковых запросов от основной службы. Эрик Хуиза написал отличный пост о примере извлечения компонентов с использованием конкретной схемы. http://erichuiza.blogspot.bg/2012/06/performing-search-queries-with-core.html

Кроме того, можно передать в качестве параметра «Searchin», как указано в этом ответе, Search in multiple folders via core service?

В целом этот код должен работать быстрее и быть более гибкими. Возможно, вам все равно придется применять фильтр после поиска, как в вашем коде выше, если вы не можете фильтровать все по поисковому запросу.