Иерархическая модель привязки - PullRequest
0 голосов
/ 17 октября 2018

Я написал код для получения иерархических данных о местоположении.Я могу получить иерархию только до ДВУХ уровней, но то, что я ищу иерархию n-го уровня.Я также написал рекурсивную функцию, но не смог добавить данные в иерархию.

Класс модели данных: -

public class RoomDTO
    {
        public Guid RoomId { get; set; }
        public string Name { get; set; }    

        public Guid? ParentRoomId { get; set; }       
        public List<RoomDTO> Children { get; set; } = new List<RoomDTO>();

    }

Родительская функция: -

private List<RoomDTO> RoomData(List<SubLocation> subLocations)
        {
            List<RoomDTO> rooms = new List<RoomDTO>();
            foreach (var location in subLocations.Where(x => x.HasChildLocations))
            {
                var subLocationDTO = new RoomDTO
                {
                     RoomId = location.SubLocationId
                     ,Children = getChild(subLocations, location, new RoomDTO()).Children
                };

                rooms.Add(subLocationDTO);
            }
            return rooms;
        }

Рекурсивная функция: -

private RoomDTO getChild(List<SubLocation> list, SubLocation location, RoomDTO roomDTO)
        {

            var child = list.Where(x => x.ParentSubLocationId == location.SubLocationId).ToList();
            for (int i = 0; i < child.Count; i++)
            {
                var childRoom = new RoomDTO {
                    ParentRoomId = child[i].ParentSubLocationId
                    , RoomId = child[i].SubLocationId
                };                
                roomDTO.Children.Add(childRoom);
                getChild(list, child[i], roomDTO);
            }
            return locList; 
        }

Функция вызова: -

 public void GetRoomList()
{
            var subLocationList = _context.SubLocations.AsNoTracking().ToList();

            var data = RoomData(subLocationList);

}

Пожалуйста, сообщите, что неверноЯ здесь делаю.

1 Ответ

0 голосов
/ 25 октября 2018

Я выполнил приведенные ниже шаги для решения проблемы: 1> Добавлено поле (SortId) в таблице, чтобы определить последовательность родительских и дочерних элементов.2> Из списка элементов отфильтровали данные на основе ParentId, а затем отсортировали по SortId

if (summaryList.Count > 0)
            {
                //make Mneu structure 
                foreach (var menu in summaryList.Where(x => x.data.ParentSubLocationId == null).OrderBy(x => x.data.SortId))
                {
                    menu.children = GetChildMenuIetms(menu, summaryList);
                    menus.Add(menu);
                }
            }

3> В вышеприведенном цикле foreach выполнил рекурсивную функцию GetChildMenuItem для извлечения дочерних элементов, как показано ниже,

public List<Child> GetChildMenuIetms(Child menuItem, List<Child> menuItems)
    {
        List<Child> childerns = null;
        childerns = menuItems.Where(x => x.data.ParentSubLocationId == menuItem.data.SubLocationId).OrderBy(x => x.data.SortId).ToList();

        if (childerns != null && childerns.Count > 0)
        {
            for (int i = 0; i < childerns.Count; i++)
            {

                childerns[i].children = GetChildMenuIetms(childerns[i], menuItems.Where(x => !childerns.Any(c => c.data.SubLocationId == x.data.SubLocationId)).ToList());
            }
        }
        return childerns;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...