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
相关产品推荐
相关产品推荐

