我有一个具有以下结构的模式;
基本上,菜单可以具有嵌套子级。而其他表仅包含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/