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

EF Core TPH:如何在单查询中包含派生类型的导航属性?

EF Core TPH继承:单查询获取所有BaseType实例并包含FirstChild的Link导航属性

直接使用DbContext.BaseTypes.Include(x => x.Link)无效,是因为Link是FirstChild专属的导航属性,BaseType本身并不具备,EF Core无法自动识别该如何关联加载。不过可以通过强制类型转换或投影查询实现单查询加载,无需分两次查询。

方法1:在Include中使用强制类型转换(EF Core 3.0+支持)

通过将BaseType实例强制转换为FirstChild,明确告诉EF Core仅对该类型实例加载Link导航属性:

var allBaseTypes = dbContext.BaseTypes
    .Include(x => ((FirstChild)x).Link)
    .ToList();

执行后,EF Core会生成包含左连接的SQL查询,自动为FirstChild类型的实例填充Link数据,其他子类型实例的Link属性会保持null。

方法2:投影查询(兼容所有EF Core版本)

如果你的EF Core版本较低,或者需要更灵活的控制,可以用投影先查询所需数据,再在内存中关联导航属性:

var result = dbContext.BaseTypes
    .Select(x => new 
    {
        BaseInstance = x,
        FirstChildLink = x is FirstChild child ? child.Link : null
    })
    .ToList()
    .Select(x => 
    {
        if (x.BaseInstance is FirstChild child)
        {
            child.Link = x.FirstChildLink;
        }
        return x.BaseInstance;
    })
    .ToList();

这种方式同样是单SQL查询,先把BaseType实例和对应的Link(仅FirstChild类型)一并查出,再在内存中将Link赋值回对应的实例,最终得到包含完整导航属性的BaseType列表。


内容的提问来源于stack exchange,提问作者miechooy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:02:42