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

Posted

技术标签:

【中文标题】使用扩展方法/查询语法在 LINQ 中需要左外连接【英文标题】:Need Left Outer Join in LINQ using Extension Method /Query Syntax 【发布时间】:2013-05-26 07:54:40 【问题描述】:

我有一个具有以下结构的架构;

基本上,菜单可以有嵌套的子项。而其他表只包含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 天开始解决这个问题。对此的任何帮助都是值得赞赏的;

【问题讨论】:

为什么需要它是“扩展方法语法”?在大多数情况下,它只会让阅读变得更加困难。 ok,如果可以的话,在查询语法中也是可以接受的 【参考方案1】:

试试这个查询:

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

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

【讨论】:

在@a.DefaultIfEmpty() 附近出现错误 错误 1 ​​匿名类型成员声明符无效。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

以上是关于使用扩展方法/查询语法在 LINQ 中需要左外连接的主要内容,如果未能解决你的问题,请参考以下文章

Linq中的lambda /方法语法中的左外连接[重复]

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

使用 LINQ 的 IQueryable 左外连接的扩展方法

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

如何在 LINQ 中使用左外连接进行 SQL 查询?

LINQ查询中的左外连接[重复]