c# - 分层模型绑定
问题描述
我已经编写了用于获取该位置的分层数据的代码。我只能将层次结构提高到两级,但我正在寻找第 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> 在表中添加了字段(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;
}
推荐阅读
- html - 如何为 datetime-local 输入类型指定时间的默认值?
- django - 在 Count 之前排除相关对象
- python - 使用 Popen 打开一个进程无法关闭它(需要在 cmd 中运行 Ros 命令)
- rest - REST API URI 设计模式:非分层路径?
- java - 使用 SceneBuilder 使用数据填充 Javafx 表
- abap - 写入后如何使用f12离开程序
- python - 使用 dill.load 进行 Python 多处理
- python - Gmail SMTP 身份验证总是失败
- matlab - 如何在matlab中将表格单元格转换为单个表格
- facebook - Facebook 登录重定向 URL