微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Umbraco 7.3 - 无需使用 LINQ 就可以找到 DocumentTypeAlias 的所有子项

如何解决Umbraco 7.3 - 无需使用 LINQ 就可以找到 DocumentTypeAlias 的所有子项

我有一个非常基本的例子:

string areaType = "PrivateHomes";

var plotProperties = Model.Content.AncestorOrSelf(1)
    .Children.Where(c => c.DocumentTypeAlias.Equals("Properties")).First()
    .Children.Where(c => c.Name == areaType).First()
    .Children.First()
    .Children.First();

foreach(var child in plotProperties.Children())
{ /* Do stuff */ }

这段代码似乎......适得其反......不知何故......我的目标是获得名称为“PrivateHomes”的DocumentType“Types”的孩子 - 有没有办法在不做我的事情的情况下实现这一目标在这里做什么?上面的代码有效,但我无法评估它的影响。

解决方法

有很多选择,但这里有一些有趣的选择,不分先后顺序。

选项 1:TypedContentAtXPath
我真的很喜欢这种方法。这是我在 Umbraco 7 中的首选。在 Umbraco 7 中,发布的内容缓存为 xml。您可以探索 /App_Data/umbraco.config 中的 xml 以了解其形状。您也可以像这样使用 XPATH 查询它:

var privateHomesNode = Umbraco.TypedContentSingleAtXPath("//Properties/*[@nodeName='PrivateHomes'");

选项 2:XPathNavigator
这个选项写起来不是很有趣,但它运行得很快。当我的目标是检索值而不是整个模型时,我喜欢偶尔使用此选项。

var navigator = UmbracoContext.Current.ContentCache.GetXPathNavigator();
var privateHomesExpression = navigator.Compile("root//Properties//*[@nodeName='PrivateHomes']");
var firstPrivateHome = navigator.SelectSingleNode(privateHomesExpression);
var firstPrivateHomeId = firstPrivateHome?.GetAttribute("id","")

选项 3:UmbracoHelper 上类似 Linq 的扩展
这是您正在尝试的选项。有很多不同的方法可以做到这些。如果您使用的是 ModelsBuilder,您也可以在查询中使用强类型模型。你可以使用 .Descendants() 但你必须非常小心。它可以很快变成一个代价高昂的查询。您可能会花费大量时间用您甚至不想检索的数据构建 IPublishedContent 模型。

var privateHomesNode = Model.Content.AncestorOrSelf(1)
    .Children<CategoryPage>().First()
    .Children.First(c => c.Name == "PrivateHomes");

选项 4:检查查询
查询的方式有很多种。您可以执行像 Umbraco.TypedSearch("PrivateHomes") 这样的简单 TypedSearch,但这可能会返回您不想要的结果。你可以做一些更复杂的事情:

var externalSearcher = ExamineManager.Instance.SearchProviderCollection["externalSearcher"];
var searchCriteria = _internalSearcher.CreateSearchCriteria();
var query = searchCriteria.RawQuery("nodeName:PrivateHomes");
var results = _internalSearcher.Search(query);

您最想避免的事情是在可以帮助的情况下使用 .Descendants()。我们在 2017 年对您可以查询内容的不同方式进行了一些基准测试。这不是非常彻底,但我们的发现之一是使用 .Descendants() 的查询如下所示可能非常慢:Model.Content.AncestorOrSelf(1).DescendantsOrSelf().Where(c => c.IsDocumentType("myDocType"))。当我们重复运行上述查询时,结果会更好,因为 Umbraco 最终会将结果缓存在内存中。我们发现像 Umbraco.TypedContentAtXPath("//myDocType") 这样的 XPath 查询没有遇到第一次初始缓慢加载。我相信这是因为 XPath 查询没有花时间从所有中间结果中构建 IPublishedContent 模型。

,

像 Model.Root().Descendants("Types").Where(x => x.Name == "PrivateHomes") 这样的东西怎么样?

https://our.umbraco.com/documentation/reference/templating/mvc/querying#traversing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。