我有一个具有以下结构的模式;


基本上,菜单可以具有嵌套子级。而其他表仅包含ItemType,以及该项目的ID,即ItemTypeId(当后端用户选择选项时,将动态引用这些ID)。
现在,对于要显示的菜单,我在这里使用了内部联接(我想在这里使用左外部联接);

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天开始解决这个问题。任何对此的帮助都是可以的;

最佳答案

试试这个查询:

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

它将返回属性类型为Menu和属性的匿名类,该属性包含资产的IQueryable。我希望这就是你想要的。

关于c# - 需要使用扩展方法/查询语法在LINQ中进行左外部联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16841269/

10-12 01:22