【发布时间】:2016-08-08 14:50:15
【问题描述】:
我需要在某些特定项目下选择按模板 ID 过滤的所有子(后代)项目。 我可以通过 3 种方式做到这一点:
- 使用 GetDescendants
myitem.Axes.GetDescendants().Where(x => x.IsOfTemplate(MyItem.TemplateId)).Select(x => (MyItem)x).ToList(); -
使用 xPath
string q = string.Format("{0}//*[@@templateid='{1}']", myItem.Paths.Path, MyItem.TemplateId); var result = myItem.Database.SelectItems(q); 使用 Sitecore 搜索 API
我不能在我的情况下使用#3。让我跳过它。
Xpath 选择器 #2 应该比 #1 运行得更快,但问题在于第一次调用某个路径。
由于某种原因,首先调用具有特定路径的内容树非常慢。 在第一次调用之后,类似的调用工作得非常快,使用 #1 或 #2 的女巫风格并不重要。 Sitecore 添加一些缓存。
如何提高第一次通话的速度?
【问题讨论】:
-
你的“路径”中有多少项目?一个选项可能是使用“快速查询”,但这可能不是最好的解决方案。通常这个问题的答案是#3..为什么不可能?
-
使用 LinkDatabase。查找模板类型 XXX 的所有项目,为每个项目检查 .IsDescendantOf(yourRoot)。更多信息:intothecore.cassidy.dk/2016/05/…
-
最终会比查询方法快 100-200 倍。
-
就我个人而言,无论数据访问等如何,我都没有发现 sitecore 可以很好地扩展。如果您需要速度和大量数据,请使用您自己的缓存。也许像弹性搜索,站点核心之上的 redis 缓存层,similar to how SO works。我现在几乎只使用 SC 作为数据层。
-
嘿@Arbejdsglæde,考虑将 Richard 的回答标记为已接受,以防它对您有所帮助。