У меня есть класс, который ссылается на себя. IdModuloPai — это ключ, указывающий на родительский объект, а ModulosFilhos — дочерние объекты этого объекта.
У меня есть свойство Profundidade, которое рекурсивно вычисляет глубину этого объекта.
Еще одним важным свойством является Ordem. Он содержит желаемый порядок, определенный пользователем в этой области.
Id Nome IdModuloPai Ordem Profundidade OrdemGlobal
1 Root [NULL] 0 0 0
2 Users 1 0 1 1
3 Administration 2 0 2 2
4 Logs 2 1 2 3
5 Customers 1 0 1 4
6 Orders 5 0 2 5
Посмотрите на эту примерную таблицу.
Я пытаюсь создать функцию, похожую на Profundidade, которая вычисляет свою глобальную позицию. Я пытаюсь получить последний столбец OrdemGlobal. Затем я могу заказать объекты с помощью OrdemGlobal, и они всегда будут отображаться одинаково в каждом нужном мне месте.
Исходя из этой таблицы, правильное положение
Root
+Users
+Administration
+Logs
+Customers
+Orders
Посмотрите, что Администрация появляется перед Журналами, потому что у Администрации Ордем = 0, а у Журналов Ордем = 1.
Как я могу заархивировать желаемое поведение?
Код моего класса следует
public class ModuloModel
{
public int Id { get; set; }
public string Nome { get; set; }
public int Ordem { get; set; }
public virtual int Profundidade {
get
{
return GetDepth(this);
}
}
public int? IdModuloPai { get; set; }
public virtual ModuloModel ModuloPai { get; set; }
public virtual ICollection<ModuloModel> ModulosFilhos { get; set; }
private int GetDepth(ModuloModel moduloModel)
{
if (moduloModel == null) return 0;
if (moduloModel.IdModuloPai == null) return 0;
return GetDepth(moduloModel.ModuloPai) + 1;
}
}
EDIT: улучшенный вопрос
Я пробовал что-то вроде
public virtual int OrdemGlobal
{
get
{
return GetGlobalOrder(this);
}
}
private int GetGlobalOrder(ModuloModel moduloModel)
{
if (moduloModel == null) return 0;
if (moduloModel.ModuloPai == null) return 0;
int smallerSiblings = moduloModel.ModuloPai.ModulosFilhos.Where(x => x.Ordem < moduloModel.Ordem).Count();
return (GetGlobalOrder(moduloModel.ModuloPai) + smallerSiblings + 1;
}
Но это сбивает с толку и не возвращает желаемую информацию.