首页 > 解决方案 > 带有 SelectMany() 的平面数据,如左连接

问题描述

是否可以使用 SelectMany() 并让它表现得像左连接?

我正在尝试将实体对象展平为表格格式。只要有一个子对象, SelectMany() 就像一个魅力,但我想查看所有的父对象,无论它是否有子对象。

public class Folder
{
    [Key]
    public int Folder_Id { get; set; }
    public string Folder_Name { get; set; }
    public int Folder_order { get; set; }
    public virtual ICollection<Module> Modules { get; set; }
}
public class Module
{        
    [Key]
    public int Module_Id { get; set; }
    public int? Folder_Id { get; set; }
    public string ModuleName { get; set; }
    public virtual Folder Folder { get; set; }

}
public static List<Menu> GetMenu()
{
    var Menu = db.Folder.Get();
    var q = from u in Menu
    from m in u.Modules
    select new {folderName = u.Folder_Name, moduleName = m.ModuleName};
    return q;
}

我需要的是:

folderName="ENG",moduleName="req"

文件夹名称="ENG",模块名称="BOM"

文件夹名称="收件箱",模块名称=""

文件夹名称="帮助",模块名称=""

文件夹名称="仪表板",模块名称=""

folderName="采购",moduleName="Indent"

标签: c#entity-frameworklinqlambda

解决方案


当您选择导航属性而不是连接时,您确实遵循了实体框架的推荐做法。唉,导航属性仅适用于内部连接。所以在这种情况下SelectMany不会帮助你。所以你必须求助于一个加入:

var q =
    from u in Menu
    join m in Modules on u.Folder_Id equals m.Folder_Id into modules
    from mm in modules.DefaultIfEmpty()
    select new {folderName = u.Folder_Name, moduleName = mm?.ModuleName ?? String.Empty};
    return q;

推荐阅读