假设我们有一个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 没有版本,我只期待三种语言。
这是实现这个目标的正确方法吗?
答案 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;
}
结论:使用ItemManager.GetVersions(item,lang).Count更好 比db.GetItem(item.ID,lang).Versions.Count获取项目所包含的语言版本列表。
1.9032ms获取具有1种语言版本的版本计数。加载项目的时间:5.0206ms。朗斯:恩
在这种情况下使用ItemManager.GetVersions(item,lang)。理论上,GetItem应该提供类似的结果,因为后续的负载会利用缓存。