0

TridionからデータをフェッチするためにC#コードとTridion(CMS)クラスを使用しています。以下は、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));

これにより、すべてのパブリケーションのリスト(/ tcm:ListPublications / tcm:Item)を含むXMLドキュメントが提供され、各アイテムにはTitle属性とID属性が含まれます。

IDとタイトルだけでなく詳細が必要な場合は、各パブリケーションを個別にロードする必要があります。これは、ID属性tdse.GetObject()を使用して実行できます。

お役に立てれば。N

于 2011-07-27T23:27:05.430 に答える
0

これによると、開発者向けサイトだと思います... getAllPublicationListはある種の遅延読み込みを使用しているようです。そのため、コレクションがある場合でも、実際にはアイテムが含まれていません。

関心のあるレコードのみをロードするように、事後ではなくコレクションにフィルターを設定できるようです。

明確にするために、遅延読み込みとは、コレクションが返されたときに、コレクション内のアイテムを取り込むために必要なデータがまだ読み込まれていないことを意味します。コレクション内のアイテムにアクセスするまで、そのアイテムのデータは(たとえば、パブリケーションアイテムを作成することによって)実際にロードされます。レイジーコレクションを使用する目的は、コレクションのフィルタリングを可能にして、不要な高価な負荷を回避できるようにすることです。

HTH

于 2011-05-23T04:36:56.010 に答える