0

我正在使用 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 类。

请建议任何其他方式来执行此操作或建议上述代码中有什么问题。

谢谢。

4

2 回答 2

5

这确实是因为 Tridion 的延迟加载。如果您只需要一份出版物 ID 和标题列表,我建议您使用:

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

这将为您提供一个 XML 文档,其中包含所有出版物的列表 (/tcm:ListPublications/tcm:Item),并且每个 Item 将包含一个 Title 和 ID 属性。

如果您需要的不仅仅是 ID 和标题,那么您将必须单独加载每个出版物,您可以使用 ID 属性 tdse.GetObject() 来完成。

希望这可以帮助。ñ

于 2011-07-27T23:27:05.430 回答
0

根据我认为是开发人员网站的this ...看起来getAllPublicationList正在使用某种延迟加载,因此即使您拥有集合,您实际上也没有其中的项目。

看来您可以在他们的集合上设置过滤器,而不是事后,这样它只会加载您感兴趣的记录。

澄清一下,延迟加载意味着当返回集合时,填充其中的项目所需的数据尚未加载。直到您访问集合中的项目,才真正加载了该项目的数据(例如,通过创建发布项目)。使用惰性集合的目的是允许对集合进行过滤,从而避免不必要的昂贵负载。

高温高压

于 2011-05-23T04:36:56.010 回答