Рассмотрим следующую модель базы данных:
И следующий код запроса:
using (var context = new DatabaseEntities())
{
return context.Feed.ToHierarchy(f => f.Id_Parent, null);
}
Где ToHierarchy
является расширением ObjectSet<TEntity>
как:
public static List<TEntity> ToHierarchy<TEntity, TProperty>(this ObjectSet<TEntity> set, Func<TEntity, TProperty> parentIdProperty, TProperty idRoot) where TEntity : class
{
return set.ToList().Where(f => parentIdProperty(f).Equals(idRoot)).ToList();
}
Это приведет к примеру ответа в формате JSON:
[
{
"Description":"...",
"Details":[ ],
"Id":1,
"Id_Parent":null,
"Title":"...",
"URL":"..."
},
{
"Description":"...",
"Details":[
{
"Description":"...",
"Details":[ ],
"Id":4,
"Id_Parent":3,
"Title":"...",
"URL":"..."
},
{
"Description":"...",
"Details":[
{
"Description":"...",
"Details":[
{
"Description":"...",
"Details":[ ],
"Id":7,
"Id_Parent":6,
"Title":"...",
"URL":"..."
}
],
"Id":6,
"Id_Parent":5,
"Title":"...",
"URL":"..."
}
],
"Id":5,
"Id_Parent":3,
"Title":"...",
"URL":null
}
],
"Id":3,
"Id_Parent":null,
"Title":"...",
"URL":null
}
]
Как вы, возможно, заметили, ToHierarchy
метод должен (и, очевидно, действительно) извлекать все строки из заданного набора (плоские) и возвращать их иерархическое представление в соответствии с "родительским свойством".
Когда я был в середине моей реализации, я быстро попробовал свой код, и на удивление это сработало! Теперь я представляю, как странно это звучит для многих из вас, но я действительно не понимаю, почему или как этот кусок кода работает, хотя я вроде написал это самостоятельно ...
Не могли бы вы объяснить, как это работает?
P.S .: если вы посмотрите ближе, ToHierarchy
- это не то же самое, что .Include("Details")
.