2016-03-30 1 views
0

部分的なビューマクロでは、 "breakInheritance"というプロパティを含む最初の祖先または自己ノードを取得しようとしていて、値はTrueです。私はSOとOur.Umbracoのフォーラムで狩りをしながら約1時間このステートメント/クエリを攻撃してきましたが、私はどこにもいないのではないかと心配しています。私はこれがかなりまっすぐであるべきであるように感じる。Umbraco 7でブール値のプロパティを持つ最初の親ノードを取得する方法

ラムダ式は、赤い下線と言うれる

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

私は、このエラーのリソースのトンを見つけたが、私が見てきたすべてのケースでそれはちょうど編集することができるsomeonesのカスタム拡張メソッドなので、あまりにも私をあまり助けてくれませんでした。

答えて

3

にAncestorsOrSelf方法をキャストすることにより、目的の動作を取得することができました。コードでは、CurrentPage.AncestorsOrSelfまたはModel.Content.AncestorsOrSelf()のいずれかを実行できます。最初の例では、ラムダ式を受け入れていないことが明らかです。エラーメッセージに示されています。

は、代わりに次のことを試してみてください。

var node = Model.Content.AncestorsOrSelf() 
         .FirstOrDefault(n => n.HasProperty("breakInheritance") && 
              n.GetPropertyValue<bool>("breakInheritance")) 
+0

これは、ヒントに感謝素晴らしいです。また、FirstOrDefault()拡張メソッドにラムダ式を渡すことはできませんでした。 – user3267755

+1

あなたは大歓迎です。別のやり方は、 'AncestorsOrSelf(" docTypeAlias ")'にドキュメントタイプエイリアスを渡すことです。これは '.HasProperty()'を使うのではなく、ドキュメントタイプに基づいてフィルタリングすることを可能にします。それは常に可能ではないかもしれませんが、プロパティ名やエイリアスは一般的にドキュメントタイプよりも頻繁に変わるので、これを好きです。 – elolos

0

私はそれがdynamic APIstrongly typed APIを混在しない方が良いかなと思うIEnumerable<IPublishedContent>

var nodeToUse = ((IEnumerable<IPublishedContent>)CurrentPage 
    .AncestorsOrSelf()) 
    .Where(x => (x.HasProperty("breakInheritance") && x.GetPropertyValue<bool>("breakInheritance") && x.HasValue("widgets"))) 
    .FirstOrDefault(); 
関連する問題