显式查询数据库模型时EF Core关联的Joined值为null如何解决
问题原因
你当前的写法中,EF Core 无法解析自定义 Bind 方法的内部逻辑,只能先把全量的 Sensor 实体查询到内存,再执行绑定逻辑。此时如果没有显式 Include 加载导航属性,SensorType 自然为 null。这种写法不仅会触发空引用问题,还会查询 Sensor 表的所有字段,违背了用专属 Dto 仅查询必要字段的初衷。
解决方案
方案1:直接在 Select 中写投影逻辑(最简单)
直接把 Dto 映射逻辑写在 Select 的表达式树中,EF Core 可以自动解析出你需要访问 SensorType 的属性,自动生成关联表的 JOIN 查询,无需手动加 Include,且只会查询你用到的3个字段,完全符合性能要求。
var response = await _db.Sensors .Where(x => x.Enabled) .Select(x => new SensorDto { Id = x.Id, Name = x.Name, SensorTypeName = x.SensorType.Name }) .ToListAsync();
方案2:用表达式树封装绑定逻辑(适合复用场景)
如果你希望复用 Dto 绑定逻辑,不要用普通方法封装,改用表达式树定义绑定规则,EF Core 可以正常解析表达式树内容,同样不需要加 Include,也能实现仅查必要字段的效果。
首先修改绑定类:
public static class SensorDtoBinder { // 用表达式树定义映射规则,可被EF Core解析 public static readonly Expression<Func<Sensor, SensorDto>> Bind = dbItem => new SensorDto { Id = dbItem.Id, Name = dbItem.Name, SensorTypeName = dbItem.SensorType.Name }; }
调用代码:
var response = await _db.Sensors .Where(x => x.Enabled) .Select(SensorDtoBinder.Bind) .ToListAsync();
额外注意
你提供的代码里有几处拼写错误,运行前建议修正:
Sensor类中的Enbaled属性拼写错误,应为EnabledSensor类中的pubic SensorType SensorType访问修饰符拼写错误,应为publicSensorType类中未定义DisplayName属性,你绑定逻辑中用到的dbItem.SensorType.DisplayName应为dbItem.SensorType.Name
内容的提问来源于stack exchange,提问作者Zapnologica
相关产品推荐
相关产品推荐

