Процесс занимает много времени в цикле foreach в C # - PullRequest
0 голосов
/ 23 мая 2011

Я использую код C # и классы Tridion (CMS) для извлечения данных из Tridion, ниже приведен код для получения всех списков публикаций из Tridion.

protected void btnPublishPublicationList_Click(object sender, EventArgs e)
    {
        try
        {
            PublicationBL pubBL = new PublicationBL();
            TridionCollection<Publication> pubAllList = pubBL.getAllPublicationList();
            List<PublicationsBO> pubBos = new List<PublicationsBO>();

            foreach (Publication pub in pubAllList)
            {
                if ((pub.Title.StartsWith("07"))||(pub.Title.StartsWith("08")))
                {
                    PublicationsBO pubBO = new PublicationsBO();
                    pubBO.publicationID = pub.ID;
                    pubBO.publicationName = pub.Title;
                    pubBos.Add(pubBO);
                }
            }

            pubBL.createPublicationListXML(pubBos);          
        }
        catch (Exception ex)
        {
            log.Error(ex.Message);
        }
    }

В приведенном выше коде нажмите кнопку,Я использую код .net и класс Tridion, чтобы получить список всех публикаций, как показано ниже:

TridionCollection<Publication> pubAllList = pubBL.getAllPublicationList();

Я получаю список всех публикаций очень быстро из Tridion, однако, когда я собираюсь получить цикл foreach , как показано ниже, мой процесс застревает, и на это уходит много времени.

foreach (Publication pub in pubAllList)
            {
                if ((pub.Title.StartsWith("07"))||(pub.Title.StartsWith("08")))
                {
                    PublicationsBO pubBO = new PublicationsBO();
                    pubBO.publicationID = pub.ID;
                    pubBO.publicationName = pub.Title;
                    pubBos.Add(pubBO);
                }
            }

После отладки я обнаружил, что когда отладчик приходит к foreach (Publication pub in pubAllList), он отнимает много времени.Я думаю, что для создания объекта класса Publication требуется время, и это класс Tridion.

Пожалуйста, предложите любой другой способ сделать это или подскажите, что не так в приведенном выше коде.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Это действительно из-за ленивой загрузки Тридиона.Если вам нужен только список идентификаторов публикаций и названий, я бы порекомендовал использовать:

TDSE tdse = new TDSEClass():
XmlDocument publicationList = new XmlDocument();
publicationList.LoadXml(tdse.GetListPublications(ListColumnFilter.XMLListIDAndTitle));

. Это даст вам документ XML, содержащий список всех публикаций (/ tcm: ListPublications / tcm: Item), и каждый элемент будет содержать атрибуты заголовка и идентификатора.

Если вам нужно больше подробностей, чем просто идентификатор и заголовок, вам придется отдельно загружать каждую публикацию, что можно сделать с помощью атрибута идентификатора tdse..GetObject ().

Надеюсь, это поможет.N

0 голосов
/ 23 мая 2011

в соответствии с это , который, я думаю, является сайтом разработчиков ... похоже, что getAllPublicationList использует какую-то ленивую загрузку, поэтому, даже если у вас есть коллекция, у вас на самом деле нет элементов в ней .

Похоже, что вы можете устанавливать фильтры для их коллекции, а не по факту, чтобы она загружала только те записи, которые вас интересуют.

для пояснения, отложенная загрузка означает, что при возврате коллекции данные, необходимые для заполнения элементов в ней, еще не загружены. Только когда вы получите доступ к элементу в коллекции, данные (например, путем создания элемента Publication) для этого элемента фактически загружаются. Цель использования отложенной коллекции - разрешить фильтрацию коллекции, чтобы избежать ненужных дорогостоящих загрузок.

НТН

...