2

我有一个具有以下结构的架构;
在此处输入图像描述

基本上,菜单可以有嵌套的子级。其他表只包含ItemType, 以及该项目的 Id 即ItemTypeId(当用户在后端选择选项时会动态引用这些表)。现在,为了显示菜单,我在这里使用了Inner Join(我想在这里使用Left Outer Join);

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表中是否有数据(我是左外连接)。
2)我想使用强类型视图模型来实现这一点,它将包含两个表中的以下属性
i)MenuId ii)名称 iii)ParentId iv)ChildMenus v)MenuItemType vi)MenuItemTypeId

我试图从 4 天开始解决这个问题. 对此的任何帮助都是值得赞赏的;

4

1 回答 1

0

试试这个查询:

DbContext.Set<Menu>()
         .GroupJoin(DbContext.Set<Asset>(), m => m.MenuId, a => a.MenuId, (m, as) => new { m, as = as.DefaultIfEmpty() });

它将返回具有 Menu 类型的属性 m 和包含资产 IQueriable 的属性的匿名类。我希望这是你想要的。

于 2013-05-30T16:35:45.503 回答