我有一个具有以下结构的模式;
基本上,菜单可以嵌套子项。其他表只保存ItemType
,以及该项的Id,即ItemTypeId
(这些是在后端的用户选择选项时动态引用的)。
现在,对于要显示的菜单,我在这里使用了内部加入(我希望这里使用左外部加入);
public IQueryable<Menu> GetMenuWithAsset()
{
return DbContext.Set<Menu>()
.Join(DbContext.Set<Asset>(), m => m.MenuId, a => a.MenuId, (m, a) => m);
}
并且在我的基本控制器中,我正在这样取出它;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var menus = Uow.Menus.GetMenuWithAsset()
.Select(m => new ParentMenuViewModel()
{
MenuId = m.MenuId,
Name = m.Name,
ParentId = m.ParentId
})
.ToList<ParentMenuViewModel>();
ViewBag.Menus = CreateVM(0, menus);
base.OnActionExecuting(filterContext);
}
public IEnumerable<ParentMenuViewModel> CreateVM(int parentid, List<ParentMenuViewModel> list)
{
var newList = list.Where(m=> m.ParentId==parentid)
.Select(m=> new ParentMenuViewModel()
{
MenuId = m.MenuId,
Name = m.Name,
ParentId = m.ParentId,
ChildMenus = CreateVM(m.MenuId, list)
});
return newList;
}
此代码按预期正常工作。但是,这就是我想要的;
1)我想在Asset
表格中显示所有菜单(包括子菜单),而不是{{1}}表格(i gess left outer join)。
2)我想使用强类型的viewmodel实现这一点,它将保存两个表中的以下属性
i)MenuId ii)名称iii)ParentId iv)ChildMenus v)MenuItemType vi)MenuItemTypeId
我试图从4天后解决这个问题。任何有关这方面的帮助都是可以预见的;
答案 0 :(得分:0)
尝试此查询:
DbContext.Set<Menu>()
.GroupJoin(DbContext.Set<Asset>(), m => m.MenuId, a => a.MenuId, (m, as) => new { m, as = as.DefaultIfEmpty() });
它将返回匿名类,其属性为类型为Menu,属性为包含IQueryable of Assets。我希望这就是你想要的。