Umbraco 8 - 使用 ContentAtXPath() 方法获取节点的子节点



我一直在重构现有的 Umbraco 项目,以便在取回文档数据时使用性能更高的查询,因为以前所有内容都是使用 LINQ 返回的。我一直在使用Umbraco通过XPaths和Examine查询的组合。

我目前在尝试使用Umbraco.ContentAtXPath()方法获取子文档时感到困惑。我想做的是根据我解析到该方法的路径获取子文档。这是我目前拥有的:

IEnumerable<IPublishedContent> umbracoPages = Umbraco.ContentAtXPath("//* [@isDoc]/descendant::/About [@isDoc]");

运行此操作将返回"对象引用未设置为对象的实例"错误,并且无法准确看到我出错的地方(Umbraco 中这种查询形式的新功能(。

理想情况下,我希望增强查询,以便也使用非 LINQ 方法执行排序,如此处所示。

在 Umbraco 8 之前,内容被缓存在 XML 文件中,这使得 XPath 非常适合有效地查询内容。然而,在 v8 中,所谓的"NuCache"既不是基于文件的,也不是基于 XML 的,因此 XPath 查询支持仅适用于 ...井。。。我猜是旧时代的缘故?无论哪种方式,它都可能不会非常高效,而且(我建议(不是"目标"的东西。也就是说,我当然不知道您要从什么更改(Linq 可以是很多东西(:-/

这当然取决于数据集的大小。

由于 Umbraco 已经摆脱了 XML 支持的缓存,因此您应该针对内容模型研究 Linq 查询。请确保使用 ModelsBuilder 生成模型。

在小型数据集上,Linq 将比检查快得多。 在大型数据集上,Examine/Lucene的性能将更加稳定。

查询NuCache在Umbraco 8中非常快,仅次于Examine 搜索。 假设您使用的是模型生成器,并且您的"关于"页面是主页的子页面,则可以使用:

var homePage = (HomePage) Model.Root();
var aboutPage = homePage?.Children<AboutPage>().FirstOrDefault();
var umbracoPages = aboutPage.Children();

其中HomePage是主页文档类型别名,AboutPage是"关于"页面文档类型别名。

最新更新