首页 > 解决方案 > 分层模型绑定

问题描述

我已经编写了用于获取该位置的分层数据的代码。我只能将层次结构提高到两级,但我正在寻找第 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);

}

请告知我在这里做的不正确。

标签: c#entity-frameworklinq

解决方案


我按照以下步骤解决了这个问题,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函数来获取子items,如下图,

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;
    }

推荐阅读