You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:42:41