获取具有版本的所有语言的项目

时间:2014-04-07 14:43:58

标签: sitecore sitecore7

假设我们有一个Item Product(其中包含en,jp,zh和u版本的版本)。我怎样才能在en,jp和zh中得到这个项目,而不是在ru。

我尝试了以下代码。

Item tempItem = Sitecore.Context.Database.GetItem(tempID);
foreach (var itemLanguage in tempItem.Languages)
{
  //Do Something
}

此处tempItem.Languages正在返回所有四种语言,因为 ru 没有版本,我只期待三种语言。

这是实现这个目标的正确方法吗?

2 个答案:

答案 0 :(得分:7)

您需要检查退回商品的版本号。可能有更好的方法来实现这一点,但是按照你自己的代码示例,它看起来像这样:

Item tempItem = Sitecore.Context.Database.GetItem(tempID);
foreach (var itemLanguage in tempItem.Languages)
{
    var item = tempItem.Database.GetItem(tempItem.ID, itemLanguage);
    if (item.Versions.Count > 0)
    {
        // do something. If there is no "ru" version, this will be 0
    }
}

答案 1 :(得分:4)

我进行了一项实验,以获取具有不同子项数的项目版本数量的语言列表,以检查系统的价格是多少。

下面的脚本返回一个列表,其中包含具有该项目版本的语言名称。

public static List<string> LanguagesWithContent(this Item item)
{
    var result = ItemManager.GetContentLanguages(item).Select(lang => new {
        lang.Name,
        Versions = ItemManager.GetVersions(item, lang).Count
        //this is better than db.GetItem(item.ID, lang).Versions.Count      
    }).Where(t => t.Versions > 0).Select(t => t.Name).ToList();
    return result;
}

基准测试绩效

使用GetVersions首次加载 - 当数据不是来自缓存

  • 0.7298ms获得8种语言版本的版本。装载物品的时间:9.3041ms。 Langs:es-ES,es-MX,sv-SE,en,it-IT,pt-BR,fr-FR,de-DE
  • 0.0448ms获得7种语言版本的版本。加载项目的时间:2.0039ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE,ro-RO
  • 0.0334ms以获得具有6种语言版本的版本计数。装载物品的时间:3.145ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE
  • 0.0307ms获得5种语言版本的版本。装货时间:1.5976ms。 Langs:es-MX,en,it-IT,fr-FR,de-DE
  • 0.0353ms获得4种语言版本的版本。加载项目的时间:10.2764ms。 Langs:en,de-DE,ja-JP,da
  • 0.0258ms以获得具有3种语言版本的版本计数。装载物品的时间:1.9507ms。 Langs:en,de-DE,ja-JP
  • 0.0193ms以获得具有2种语言版本的版本计数。加载项目的时间:2.0533ms。 Langs:en,de-DE
  • 0.0201ms以获得具有1种语言版本的版本计数。加载项目的时间:4.7689ms。朗斯:恩

使用GetItem而不是GetVersions

重复第一次加载实验

结论:使用ItemManager.GetVersions(item,lang).Count更好 比db.GetItem(item.ID,lang).Versions.Count获取项目所包含的语言版本列表。

  • 3.4936ms获得8种语言版本的版本。加载项目的时间:8.9118ms。 Langs:es-ES,es-MX,sv-SE,en,it-IT,pt-BR,fr-FR,de-DE
  • 0.9966ms以获得具有7种语言版本的版本计数。加载项目的时间:1.6489ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE,ro-RO
  • 1.0875ms获得6种语言版本的版本。装载物品的时间:3.1538ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE
  • 0.5891ms以获得具有5种语言版本的版本计数。装货时间:1.4402ms。 Langs:es-MX,en,it-IT,fr-FR,de-DE
  • 2.2096ms获得4种语言版本的版本计数。装载物品的时间:9.8701ms。 Langs:en,de-DE,ja-JP,da
  • 0.9255ms以获得具有3种语言版本的版本计数。装载物品的时间:2.5175ms。 Langs:en,de-DE,ja-JP
  • 0.7606ms以获得具有2种语言版本的版本计数。装载物品的时间:2.2407ms。 Langs:en,de-DE
  • 1.9032ms获取具有1种语言版本的版本计数。加载项目的时间:5.0206ms。朗斯:恩

    后续加载 - 项目已缓存

    在这种情况下使用ItemManager.GetVersions(item,lang)。理论上,GetItem应该提供类似的结果,因为后续的负载会利用缓存。

  • 0.569ms获得8种语言版本的版本。加载项目的时间:0.0372ms。 Langs:es -ES,es-MX,sv-SE,en,it-IT,pt-BR,fr-FR,de-DE
  • 0.0429ms获得7种语言版本的版本。加载项目的时间:0.0475ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE,ro-RO
  • 0.025ms以获得具有6种语言版本的版本计数。加载项目的时间:0.0247ms。 Langs:es-ES,es-MX,en,it-IT,fr-FR,de-DE
  • 0.0239ms获得5种语言版本的版本。装载物品的时间:0.0201ms。 Langs:es-MX,en,it-IT,fr-FR,de-DE
  • 0.0342ms获得4种语言版本的版本计数。装载物品的时间:0.0216毫秒。 Langs:en,de-DE,ja-JP,da
  • 0.0258ms以获得具有3种语言版本的版本计数。装载物品的时间:0.0197ms。 Langs:en,de-DE,ja-JP
  • 0.0228ms以获得具有2种语言版本的版本计数。加载项目的时间:0.019ms。 Langs:en,de-DE
  • 0.0228ms以获得具有1种语言版本的版本计数。装载物品的时间:0.0178ms。朗斯:恩