Sitecore Axes.IsDescendantOf / Axes.IsAncestorOf - Inclusive?
items, sitecore, sitecore6
Solution
I would have to believe that the methods in Sitecore should not be named `IsAncestorOf` and `IsDescendantOf`. Based on your finding, and quickly looking at the Sitecore code, the methods should really be named `IsAncestorOrSelf` and `IsDescendantOrSelf`.
For this example,
Sitecore.Data.Items.Item x = //some item;
Sitecore.Data.Items.Item y = //some item;
x.Axes.IsAncestorOf(y)
x.Axes.IsDescendantOf(y)
The `IsAncestorOf` method is comparing `x.ID == y.ID`. It will then keep comparing `x.ID` to the `ID` of y's parent, which is why it should be named `IsAncestorOrSelf`.
The `IsDescendantOf` method is comparing if the `LongID` path of `x` starts with the `LongID` path of `y`. Being that a string always starts with the same string we again see that this method should be named `IsDescendantOrSelf`.
FYI, A `LongID` path looks like this `/{11111111-1111-1111-1111-111111111111}/{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}` and I suspect is used rather than `/sitecore/content/home` in order to get around the fact that sitecore allows siblings to have the same name.
Problem
Is there a reason or something that I am missing that has Sitecore return `true` for both `Item.Axes.IsDescendantOf()` and `Item.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)); ``` //True //True Edit: Anyone whom may stumble across this answer looking for non-inclusive `IsAncestorOf` or `IsDescendantOf`, below are a couple examples where I need to find the highest level elements in a multi-select field for news categories. ``` newsCategories .Where(x => newsCategories .Any(y => x != y && !x.Axes.IsDescendantOf(y))) ``` and ``` newsCategories .Where(x => newsCategories .Any(y => x != y && !x.Axes.IsDescendantOf(y))) ```