EF Core查询映射时如何将未关联TaskGroup的Task对应属性设为null
问题原因
你遇到的报错是因为EF Core查询翻译器无法正确解析判断外键是否有值+访问关联导航属性的条件分支逻辑;而第二种直接构造TaskGroupModel的写法,当关联TaskGroup不存在时,EF Core会为所有属性赋值默认值,生成无意义的空对象。
可行解决方案
方案1:直接判断导航属性(兼容EF Core 5+)
优先判断导航属性本身是否为null,EF Core可正常翻译该逻辑:
var result = context.Task .Include(t => t.TaskGroup) .Select(x => new TaskModel { TaskId = x.TaskId, Name = x.Name, TaskGroup = x.TaskGroup != null ? new TaskGroupModel { TaskGroupId = x.TaskGroup.TaskGroupId, Name = x.TaskGroup.Name } : null }) .ToList();
方案2:匿名类型中转(全版本兼容)
如果用的是EF Core 3.x及更低版本,可先通过匿名类型查询数据库结果,再在内存中转成业务模型:
var result = context.Task .Select(x => new { x.TaskId, x.Name, GroupInfo = x.TaskGroup != null ? new { x.TaskGroup.TaskGroupId, x.TaskGroup.Name } : null }) .AsEnumerable() // 后续逻辑转为内存执行,避免EF翻译报错 .Select(x => new TaskModel { TaskId = x.TaskId, Name = x.Name, TaskGroup = x.GroupInfo != null ? new TaskGroupModel { TaskGroupId = x.GroupInfo.TaskGroupId, Name = x.GroupInfo.Name } : null }) .ToList();
方案3:使用AutoMapper简化映射
如果你项目中已经引入AutoMapper,只需要配置好实体到业务模型的映射关系,直接调用ProjectTo方法即可自动处理null场景:
// 映射配置 CreateMap<TaskMSSQLModel, TaskModel>(); CreateMap<TaskGroupMSSQLModel, TaskGroupModel>(); // 查询代码 var result = context.Task .ProjectTo<TaskModel>(mapper.ConfigurationProvider) .ToList();
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

