Как получить первый родительский узел с логическим свойством в Umbraco 7

В макросе частичного представления я пытаюсь получить первый предок или собственный узел, который содержит свойство с именем «breakInheritance» и имеет значение True. Я атаковал это утверждение/запрос уже около часа, охотясь на SO и на форумах Our.Umbraco, но боюсь, что ничего не добьюсь. Я чувствую, что это должно быть довольно прямолинейно.

Запрос

var nodeToUse = CurrentPage.AncestorOrSelf(x => (x.HasProperty("breakInheritance") && x.GetPropertyValue<bool>("breakInheritance")));

Лямбда-выражение подчеркнуто красным и написано - Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

Я нашел множество ресурсов по этой ошибке, но во всех случаях, которые я видел, это был чей-то пользовательский метод расширения, который они могли просто отредактировать, так что это не слишком помогло мне.


person user3267755    schedule 30.03.2016    source источник


Ответы (2)


Я бы сказал, что лучше не смешивать строго типизированный API с динамический API. В вашем коде вы можете сделать либо CurrentPage.AncestorsOrSelf, либо Model.Content.AncestorsOrSelf(), при этом первый пример явно не принимает лямбда-выражение, как указано в сообщении об ошибке.

Вместо этого попробуйте следующее:

var node = Model.Content.AncestorsOrSelf()
                        .FirstOrDefault(n => n.HasProperty("breakInheritance") && 
                                             n.GetPropertyValue<bool>("breakInheritance"))
person elolos    schedule 30.03.2016
comment
Это здорово, спасибо за советы. Я также понятия не имел, что вы можете передать лямбда-выражение в метод расширения FirstOrDefault(). - person user3267755; 31.03.2016
comment
Пожалуйста. Еще один трюк — передать псевдоним типа документа в AncestorsOrSelf("docTypeAlias"), что позволит вам фильтровать на основе типа документа, а не использовать .HasProperty(). Это не всегда возможно, но я предпочитаю это, потому что имена свойств/псевдонимы обычно меняются чаще, чем типы документов. - person elolos; 31.03.2016

Я смог получить желаемое поведение, приведя метод AncestorsOrSelf к IEnumerable<IPublishedContent>

var nodeToUse = ((IEnumerable<IPublishedContent>)CurrentPage
    .AncestorsOrSelf())
    .Where(x => (x.HasProperty("breakInheritance") && x.GetPropertyValue<bool>("breakInheritance") && x.HasValue("widgets")))
    .FirstOrDefault();
person user3267755    schedule 30.03.2016