我正在查看Sitecore市场中可用的Sitemap模块,看起来它正在使用
中的某些内容[Pseudocode and several lines combined]
var items = database.Items[Factory.GetSite(siteName).rootpath].Axes.GetDescendants();
然后按模板ID过滤预期的项目,并按项目ID排除意外的项目。
我只是想知道..不是这个根。后代的东西会对性能产生指数性的影响吗? Sitecore的新手,请稍微阐明一下。此外,如果我只是wana得到所有项目(满足某些条件,如发布和最重要的,可能基于主模板或东西......我正在寻找一种方式,我不必选择这样的模板,如果我实现了我自己的版本,没有GUI(例如通用处理程序),然后当然映射ID会非常难看)那么有更好的方法吗? (非常有信心有一个!)
答案 0 :(得分:2)
Item.Axes.GetDescendants()确实可能是一个潜在的性能损失,但是,Sitecore使用一个所谓的Item缓存,它缓存从数据库中读取的项目。因此,第一次点击可能需要一些时间,但第二次点击可以读取项目缓存中的项目,您也可以缓存您的Sublayout或渲染。
但是,我会进行一些更改并使用StartPath
而不是RootPath仅包含主页下面的项目,因为StartPath是您的主页,RootPath是父项。
我还会将复选框字段“IncludeInSitemap”添加到内容项的基本模板,并使用LINQ过滤此选中字段上的项目。
var items = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartItem)
.Axes.GetDescendants()
.Where(item => item.Fields["IncludeInSitemap"].Value.Equals("1"));
当然,你需要添加一些额外的空引用检查,但你明白了。