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

Sitecore 获取具有版本的所有语言的项,sitecore,sitecore7,Sitecore,Sitecore7,假设我们有一个Item产品(它有en、jp、zh版本和ru的0版本)。我怎样才能得到这个项目在en,jp和zh,而不是在ru 我尝试了下面的代码 Item tempItem=Sitecore.Context.Database.GetItem(tempID); foreach(tempItem.Languages中的var itemLanguage) { //做点什么 } 这里tempItem.Languages返回了我预期只有三种语言的所有四种语言,因为ru没有版本 这是实现这一目标的正确方法

假设我们有一个Item产品(它有en、jp、zh版本和ru的0版本)。我怎样才能得到这个项目在en,jp和zh,而不是在ru

我尝试了下面的代码

Item tempItem=Sitecore.Context.Database.GetItem(tempID);
foreach(tempItem.Languages中的var itemLanguage)
{
//做点什么
}
这里
tempItem.Languages
返回了我预期只有三种语言的所有四种语言,因为ru没有版本


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

您需要检查返回项目的版本计数。可能有更好的方法来实现这一点,但是按照您自己的代码示例,它看起来是这样的:

Item tempItem=Sitecore.Context.Database.GetItem(tempID);
foreach(tempItem.Languages中的var itemLanguage)
{
var item=tempItem.Database.GetItem(tempItem.ID,itemLanguage);
如果(item.Versions.Count>0)
{
//做点什么。如果没有“ru”版本,这将是0
}
}

我做了一个实验,得到了一个包含不同版本数的语言列表,用于检查不同版本的子项在系统上的开销

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

包含内容的公共静态列表语言(此项)
{
var result=ItemManager.GetContentLanguages(项)。选择(lang=>new{
郎的名字,
Versions=ItemManager.GetVersions(项目,语言).Count
//这比db.GetItem(item.ID,lang).Versions.Count更好
}).Where(t=>t.Versions>0);
返回结果;
}

基准绩效 第一次使用GetVersions加载-当数据不是来自缓存时
  • 0.7298ms以获取8种语言版本的版本计数。加载项目的时间:9.3041ms。语言:es es、es MX、sv SE、en、it、pt BR、fr fr、de
  • 0.0448ms以获取7种语言版本的版本计数。加载项目的时间:2.0039ms。语言:es es,es MX,en,it,fr fr,de,ro
  • 0.0334ms以获取6种语言版本的版本计数。加载项目的时间:3.145ms。Langs:es-es,es-MX,恩,it,fr-fr,de-de
  • 0.0307ms以获得5种语言版本的版本计数。加载项目的时间:1.5976ms。Langs:es MX,恩,it,fr fr,de
  • 0.0353ms以获取4种语言版本的版本计数。加载项目的时间:10.2764ms。兰斯:恩,德,雅,日,达
  • 0.0258毫秒以获取3种语言版本的版本计数。加载项目的时间:1.9507ms。Langs:en,de,ja,JP
  • 0.0193ms以获取两种语言版本的版本计数。加载项目的时间:2.0533毫秒。兰斯:恩,德,德
  • 0.0201ms以获取1语言版本的版本计数。加载项目的时间:4.7689ms。兰斯:嗯
重复第一次加载实验,使用GetItem而不是GetVersions 结论:最好使用ItemManager.GetVersions(item,lang).Count 而不是db.GetItem(item.ID,lang).Versions.Count,以获取项包含的语言版本列表

  • 3.4936ms以获取8种语言版本的版本计数。加载项目的时间:8.9118ms。语言:es es、es MX、sv SE、en、it、pt BR、fr fr、de
  • 0.9966ms以获取7种语言版本的版本计数。加载项目的时间:1.6489ms。语言:es es,es MX,en,it,fr fr,de,ro
  • 1.0875ms以获取6种语言版本的版本计数。加载项目的时间:3.1538ms。Langs:es-es,es-MX,恩,it,fr-fr,de-de
  • 0.5891ms以获取5种语言版本的版本计数。加载项目的时间:1.4402ms。Langs:es MX,恩,it,fr fr,de
  • 2.2096ms以获取4种语言版本的版本计数。加载项目的时间:9.8701ms。兰斯:恩,德,雅,日,达
  • 0.9255ms以获取3种语言版本的版本计数。加载项目的时间:2.5175毫秒。Langs:en,de,ja,JP
  • 0.7606ms以获取两种语言版本的版本计数。加载项目的时间:2.2407ms。兰斯:恩,德,德
  • 1.9032ms以获取1种语言版本的版本计数。加载项目的时间:5.0206毫秒。兰斯:嗯

    后续加载-项已缓存 在本例中使用ItemManager.GetVersions(item,lang)。理论上,GetItem应该给出类似的结果,因为后续加载会利用缓存

  • 0.569ms以获取8种语言版本的版本计数。加载项目的时间:0.0372ms。语言:es-es、es MX、sv SE、en、it、pt BR、fr fr、de
  • 0.0429ms以获取7种语言版本的版本计数。加载项目的时间:0.0475ms。语言:es es,es MX,en,it,fr fr,de,ro
  • 0.025ms以获取6种语言版本的版本计数。加载项目的时间:0.0247ms。Langs:es-es,es-MX,恩,it,fr-fr,de-de
  • 0.0239ms以获取5种语言版本的版本计数。加载项目的时间:0.0201ms。Langs:es MX,恩,it,fr fr,de
  • 0.0342ms以获取4种语言版本的版本计数。加载项目的时间:0.0216ms。兰斯:恩,德,雅,日,达
  • 0.0258毫秒以获取3种语言版本的版本计数。加载项目的时间:0.0197ms。Langs:en,de,ja,JP
  • 0.0228ms以获取两种语言版本的版本计数。加载项目的时间:0.019ms。兰斯:恩,德,德
  • 0.0228ms以获取1种语言版本的版本计数。加载项目的时间:0.0178ms。兰斯:嗯

您的基准测试结果是否为x次运行的平均值?还是每次测试只测量一次?您列出的数字看起来很奇怪。这是一次运行的快照,而不是平均值。虽然我确实多次运行它来检查数字是否一致,但最好是在db.GetLanguages()上迭代,而不是在item.GetLanguages()上迭代。它们都返回系统中使用的相同语言列表(在/sitecore/system/languages中),但item.GetLanguages的速度要慢得多。我每次迭代100次,db.GetLanguages()用了0.2ms,item.GetLanguages()用了387.3ms。不要遍历Sitecore.Glo