需要使用扩展方法/查询语法在LINQ中进行左外连接

时间:2013-05-30 16:22:13

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4

我有一个具有以下结构的模式;
enter image description here

基本上,菜单可以嵌套子项。其他表只保存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天后解决这个问题。任何有关这方面的帮助都是可以预见的;

1 个答案:

答案 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。我希望这就是你想要的。