进程在C#中的foreach循环中花费了大量时间

Man*_*ngh 0 c# tridion

我正在使用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在按钮单击上面的代码中,我使用.net代码并使用Tridion类获取所有发布列表如下:

TridionCollection<Publication> pubAllList = pubBL.getAllPublicationList();
Run Code Online (Sandbox Code Playgroud)

我从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);
                }
            }
Run Code Online (Sandbox Code Playgroud)

经过调试后,我发现当调试器出现时需要foreach (Publication pub in pubAllList)花费很多时间.我认为在制作Publication类对象时需要时间,而且它是Tridion类.

请建议任何其他方式来执行此操作或建议上述代码中的错误.

谢谢.

Nun*_*res 5

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

TDSE tdse = new TDSEClass():
XmlDocument publicationList = new XmlDocument();
publicationList.LoadXml(tdse.GetListPublications(ListColumnFilter.XMLListIDAndTitle));
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个XML文档,其中包含所有发布的列表(/ tcm:ListPublications/tcm:Item),每个Item将包含Title和ID属性.

如果您需要更多详细信息而不仅仅是ID和标题,那么您必须单独加载每个发布,您可以使用ID属性tdse.GetObject()来完成.

希望这可以帮助.ñ