EF Core:无键实体关联查询实现嵌套结构JSON输出
EF Core无键实体关联查询实现方案
问题场景
定义了两个无键实体F1和F2,实体代码及数据插入情况如下:
实体类代码
[Keyless] public class F1 { public int Shop { get; set; } public int Number { get; set; } // 注意:原代码中List<Fac1>为笔误,需修正为List<F2> public List<F2> ListF2 { get; set; } = new List<F2>(); } [Keyless] public class F2 { public int Shop { get; set; } public int Number { get; set; } public int row { get; set; } public string Name { get; set; } }
插入的数据
- 插入F1:
(1, 1)、(1, 2)、(2, 1) - 插入F2:
(1, 1, 1, banana)、(1, 1, 2, grape)、(2, 1, 1, apple)
需求:执行查询后得到包含对应F2列表的F1集合,最终结果仅保留有关联F2的条目(即(1,1)和(2,1))。
实现方案
由于EF Core中无键实体无法自动配置导航关系,不能直接使用Include方法关联查询,需通过手动投影+关联过滤实现:
1. 修正实体类笔误
首先修正F1类中ListF2的初始化代码,将new List<Fac1>()改为new List<F2>(),避免编译错误。
2. 投影查询关联数据
通过Select投影,为每个F1手动查询匹配的F2集合,关联条件为Shop和Number字段相等:
var F1s = _context.F1 // 过滤Shop<=2的F1 .Where(p => p.Shop <= 2) // 过滤掉没有对应F2的F1(可选,根据需求决定) .Where(f1 => _context.F2.Any(f2 => f2.Shop == f1.Shop && f2.Number == f1.Number)) // 投影生成包含F2列表的F1对象 .Select(f1 => new F1 { Shop = f1.Shop, Number = f1.Number, ListF2 = _context.F2 .Where(f2 => f2.Shop == f1.Shop && f2.Number == f1.Number) .ToList() }) .ToList();
3. 结果说明
执行上述代码后,得到的F1s集合包含两个条目:
Shop=1, Number=1,对应的ListF2包含(1, banana)和(2, grape)Shop=2, Number=1,对应的ListF2包含(1, apple)
转换为JSON后结构与需求一致。
内容的提问来源于stack exchange,提问作者Name Family
相关产品推荐
相关产品推荐

