Entity Framework Core使用Union合并两个实体时报错该如何解决?
问题原因
- 核心报错原因:
Union/Concat都是IEnumerable<T>集合类的扩展方法,你在course.Select(...).FirstOrDefault()之后拿到的是单个匿名类对象,不是集合,自然不存在这两个方法,直接调用必然报错。 - 次要问题1:获取
userId的逻辑错误,course.Select(c => c.TeacherId)返回的是IQueryable<string>类型,直接调用ToString()得到的是Linq表达式的调试文本,不是你需要的TeacherId实际值,必须调用FirstOrDefault()才能拿到真实的id值。 - 次要问题2:你从两个不同的数据库上下文查询数据,无法直接做Linq联合查询,且匿名类型和
CourseDto的结构不匹配,CourseImages要求是ICollection<CourseImagesDto>类型,你直接返回匿名类集合会出现类型转换错误。 - 次要问题3:你的方法声明为异步
async Task,但原代码里没有任何await调用,会触发异步语法警告。
修复方案
直接分别查询两个上下文的结果后,手动映射到CourseDto即可,不需要使用Union:
[HttpGet("{id}")] public async Task<ActionResult<CourseDto>> Getcourse(string id) { // 先从第一个上下文查课程信息 var course = await _context1.Courses .Where(c => c.Id == id) .Select(c => new CourseDto { Id = c.Id, Title = c.Title, TeacherId = c.TeacherId, CourseImages = c.CourseImages.Select(x => new CourseImagesDto { File = x.File }).ToList() }) .FirstOrDefaultAsync(); if (course == null) return NotFound(); // 再从第二个上下文查教师信息 var teacher = await _context2.Users .Where(u => u.Id == course.TeacherId) .Select(u => new { u.Id, u.userName }) .FirstOrDefaultAsync(); if (teacher != null) { course.TeacherName = teacher.userName; } return Ok(course); } public class CourseDto { public string Id { get; set; } public string Title { get; set; } public string TeacherId { get; set; } public string TeacherName { get; set; } public ICollection<CourseImagesDto> CourseImages { get; set; } } // 补充缺失的CourseImagesDto定义 public class CourseImagesDto { public string File { get; set; } }
内容的提问来源于stack exchange,提问作者Sami-L
相关产品推荐
相关产品推荐

