c# - 带有 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"
解决方案
当您选择导航属性而不是连接时,您确实遵循了实体框架的推荐做法。唉,导航属性仅适用于内部连接。所以在这种情况下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;
推荐阅读
- javascript - 如何放大 cytoscape 中的选定节点
- javascript - 从nodejs发送的数组中填充选择html
- c++ - 在字符串中引用 Linux 用户名以打开文件
- android - 更新 RecyclerView 中的选定进度条
- mysql - 如何根据 LIKE 条件 MySQL 连接 2 个表
- spring-boot - spring integration jdbc lock registry - 从 INT_LOCK 查询中删除已超时
- sql - 如何解析 SQL Server 表中的 XML 数据
- javascript - NodeJS 虚拟机用例
- extjs - 创建 extjs 网格布局时的问题
- python - python - 如何在python的元组列表中打印一列的所有值?