我正在使用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类获取所有出版物List,如下所示:
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类。
请建议任何其他方式来执行此操作或建议上述代码中的错误。
感谢。
答案 0 :(得分: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()来完成。
希望这会有所帮助。 Ñ
答案 1 :(得分:0)
根据我认为是开发者网站的this ...看起来getAllPublicationList正在使用某种延迟加载,所以即使你有这个集合,你也没有真正的项目。< / p>
看来您可以在其集合上设置过滤器,而不是在事实之后设置过滤器,以便它只加载您感兴趣的记录。
澄清一下,延迟加载意味着当返回集合时,填充其中的项目所需的数据尚未填充。直到您访问集合中的项目时才会实际加载该项目的数据(例如,通过创建发布项目)。使用延迟集合的目的是允许对集合进行过滤,以避免不必要的昂贵负载。
HTH