#asp.net-mvc #linq
#asp.net-mvc #linq
Вопрос:
В настоящее время у меня есть это в простом контроллере MVC Api:
var rootFolder = Umbraco.TypedMedia(200);
return rootFolder.Children().Select(s => new MediaItem
{
Name = s.Name,
Children = s.Children.Select(e => new MediaItem
{
Name = e.Name
})
});
Это работает, но возвращает только уровни 1 и 2.
Я пытался использовать
return rootFolder.Descendants()
, который возвращает все результаты со всех уровней, но «сглажен», поэтому я не вижу структуру в выходных данных. Выходные данные используются в простом приложении для навигации по древовидной структуре.
Есть идеи относительно того, как я могу сделать его рекурсивным?
При использовании потомков вывод возвращается следующим образом
[
{
"Name":"dok1"
},
{
"Name":"dok2"
},
{
"Name":"dok21"
}
]
Но это должно быть
[
{
"Name":"dok1"
},
{
"Name":"dok2"
"Children": [
{
"Name":"dok21"
}
]
}
Комментарии:
1. Как бы вы хотели структурировать вывод? Не могли бы вы добавить пример того, как вы хотите, чтобы «возврат» выглядел?
Ответ №1:
Не уверен, что вам действительно нужна рекурсия здесь — приведенного ниже решения (или чего-то подобного) должно быть достаточно
// Dictionary between level/depth(int) and the files on that level/depth
var fileDictionary = new Dictionary<int, List<MediaItem>>();
var children = rootFolder.Children();
var depth = 1;
while (children.Any())
{
var tempList = new List<MediaItem>();
children.ForEach(child => {
tempList.Add(child);
});
fileDictionary.Add(depth, tempList);
children = children.Children();
depth ;
}
Затем вы можете сделать что-то вроде:
foreach (var key in fileDictionary.Keys)
{
// Access the key by key.Key (key would be "depth")
// Access the values by fileDictionary[key] (values would be list of MediaItem)
}
Ответ №2:
Почему бы просто не создать рекурсивную функцию, подобную so?
IEnumerable<MediaItem> ConvertToMediaItems(IEnumerable<IPublishedContent> items)
{
return items?.Select(i => new MediaItem
{
Name = i.Name,
Children = ConvertToMediaItems(i.Children)
}) ?? Enumerable.Empty<MediaItem>();
}
Тогда использование было бы
var rootFolder = Umbraco.TypedMedia(200);
return ConvertToMediaItems(rootFolder.Children());
Вы также можете сделать функцию локальной, если она нужна только в одном месте.