Umbraco 7.3-查找DocumentTypeAlias的所有子项,而无需使用LINQ点选



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

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 */ }

这个代码似乎。。。适得其反以某种方式我的目标是让DocumentType";类型";其具有名称";私人住宅"-如果不做我在这里做的事情,有什么办法做到这一点吗?上面的代码是有效的,但我没有任何能力来评估它的影响

有很多选项,但这里有一些有趣的选项,可以不按特定顺序尝试。

选项1:TypedContentAtXPath
我真的很喜欢这种方法。这是我在翁布拉科7号的首选。在Umbraco7中,发布的内容被缓存为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:UmbracHelper上的类似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()。后裔("Types")。其中(x=>x.Name=="PrivateHomes")?

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

最新更新