gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:49 26 4
gpt4 key购买 nike

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

基本上,一个菜单可以有嵌套的子项。其他表仅包含 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);
}

在我的基本 Controller 中,我是这样获取它的;

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) 我想使用强类型 View 模型来实现这一点,它将保存两个表中的以下属性
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 类型属性 m 和包含 Assets IQueriable 属性的匿名类。我希望这就是您想要的。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com