2012-05-08 98 views
4

是否有某个原因或者我缺少Sitecore返回true对于Item.Axes.IsDescendantOf()Item.Axes.IsAncestorOf()Sitecore Axes.IsDescendantOf/Axes.IsAncestorOf - 包含?

var test = 
Sitecore.Context.Database.GetItem("{862B466A-079B-40E7-8661-FC064EC28574}"); 
Response.Write(test.Axes.IsAncestorOf(test)); 
Response.Write(test.Axes.IsDes(test)); 

//真
//真

编辑:任何人可以跨越这个答案找非包容性IsAncestorOfIsDescendantOf绊倒,下面是几个例子,我需要在新闻类别的多选字段中查找最高级别的元素。

newsCategories 
    .Where(x => newsCategories 
         .Any(y => x != y && !x.Axes.IsDescendantOf(y))) 

newsCategories 
    .Where(x => newsCategories 
         .Any(y => x != y && !x.Axes.IsDescendantOf(y))) 

回答

10

我不得不相信Sitecore中的方法应该是而不是可以被命名为IsAncestorOfIsDescendantOf。根据您的发现,并快速查看Sitecore代码,这些方法实际上应该命名为IsAncestorOrSelfIsDescendantOrSelf

对于这个例子,

Sitecore.Data.Items.Item x = //some item; 
Sitecore.Data.Items.Item y = //some item; 
x.Axes.IsAncestorOf(y) 
x.Axes.IsDescendantOf(y) 

IsAncestorOf方法比较x.ID == y.ID。然后它会继续比较x.ID与y父母的ID,这就是为什么它应该被命名为IsAncestorOrSelf

IsDescendantOf方法是比较LongID的路径x的路径是否起始于yLongID路径。作为一个字符串总是以相同的字符串开头,我们再次看到这个方法应该被命名为IsDescendantOrSelf

FYI,A LongID路径看起来像这样/{11111111-1111-1111-1111-111111111111}/{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}我怀疑是使用而不是/sitecore/content/home为了解决sitecore允许兄弟拥有相同名称的事实。

+1

希望我能给它两个upvotes。 – techphoria414

+0

@ techphoria414同样 –

+0

肖恩,完美地回答了这个问题,我有这样的感觉。我注意到源代码中还有一个IsDescendantOrSelf方法。 – al3xnull

2

你打在Sitecore的逻辑 “故障安全”。 这是因为你正在对它自己检查相同的项目。您需要使用2个不同的项目执行此操作以产生任何结果。

+0

Sandbeck,你知道它为什么是故障安全或它的用例吗?我很好奇答案。我注意到他们正在比较两个项目的ID,但没有检查它们是否是反编译源中的相同项目。 – al3xnull

+0

两个项目如何具有相同的ID,但是是相同的项目?除非你以某种方式考虑语言和/或数据库。 – techphoria414

+0

'string longID = this._item.Paths.LongID;字符串str2 = item.Paths.LongID;返回longID.StartsWith(str2);'道歉,如果我暗指错误的东西。 – al3xnull