public async Task <IEnumerable <HierarchicalCategory> > GetHierarchicalCategory(List <Guid> categoriesToBeExcluded) { List <Category> entities; if (categoriesToBeExcluded.IsNotNullOrEmpty()) { entities = _categoryRepository.FindAll(DomainObjectSpecifications.IdNotIn <Category>(categoriesToBeExcluded), x => x.Parent).ToList(); } else { entities = _categoryRepository.FindAll(x => x.Parent).ToList(); } TreeExtensions.ITree <Category> virtualRootNode = entities.ToTree((parent, child) => child.ParentId == parent.Id, x => x.Name); List <TreeExtensions.ITree <Category> > flattenedNodes = virtualRootNode.Children.Flatten(node => node.Children).ToList(); return(flattenedNodes.To <List <HierarchicalCategory> >()); }