1

我正在查看 Sitecore 市场中可用的站点地图模块,似乎它正在使用类似的东西

[Pseudocode and several lines combined]
var items = database.Items[Factory.GetSite(siteName).rootpath].Axes.GetDescendants();

然后按模板 id 过滤预期项目,并按项目 id 排除意外项目。

我只是想知道..这不是 root.Descendants 的东西成倍地对性能征税吗?Sitecore 的新手,所以请说明一下。另外,如果我只是想获得所有项目(满足某些条件,例如已发布,最重要的是,可能基于主模板或其他东西..即我正在寻找一种方法,我不必像那样选择模板,因为如果我实现了我自己的版本,它没有 GUI(例如通用处理程序)然后当然映射出 ID 会非常难看)然后有更好的方法吗?(非常有信心有一个!)

4

1 回答 1

2

Item.Axes.GetDescendants() 确实可能是潜在的性能损失,但是,Sitecore 使用所谓的项目缓存,它缓存从数据库中读取的项目。所以第一次点击可能需要一些时间,但第二次点击可以从项目缓存中读取项目,您也可以缓存您的子布局或渲染。

但是,我会进行一些更改,并使用StartPathRootPath 而不是仅包含主页下方的项目,因为 StartPath 是您的主页,而 RootPath 是父项目。我还将在内容项的基本模板中添加一个复选框字段“IncludeInSitemap”,并使用 LINQ 过滤此选中字段上的项目。

var items = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartItem)
 .Axes.GetDescendants()
 .Where(item => item.Fields["IncludeInSitemap"].Value.Equals("1"));

当然,您需要添加一些额外的空引用检查,但您明白了。

于 2013-06-14T14:04:46.400 回答