简化LINQ表达式:对Course关联的Skill子实体进行排序
简化多对多关联的LINQ查询(按子实体排序)
嘿,我完全懂你的需求——在.NET Core 2.0环境下查询Course列表,同时加载关联的Skill子实体,还要按Weight再按SkillId给Skill排序对吧?先给你一个简洁的实现方案,再拆解下逻辑:
简化后的LINQ表达式
如果不需要保留EF实体追踪(比如用于返回前端展示数据),直接投影是最清爽的写法:
var courses = _context.Courses .Select(c => new Course { // 映射Course的所有属性 Id = c.Id, Name = c.Name, // ... 其他Course属性按需添加 Skills = c.CourseSkills .Select(cs => cs.Skill) .OrderBy(s => s.Weight) .ThenBy(s => s.SkillId) .ToList() }) .ToList();
如果需要保留实体追踪(比如后续要修改数据),可以用这种方式:
var courses = _context.Courses .Select(c => new { Course = c, SortedSkills = c.CourseSkills .Select(cs => cs.Skill) .OrderBy(s => s.Weight) .ThenBy(s => s.SkillId) .ToList() }) .ToList() .Select(x => { x.Course.Skills = x.SortedSkills; return x.Course; });
为什么这是更简洁的写法?
- 省去了多层
Include/ThenInclude之后还要额外处理排序的冗余操作,直接在投影阶段完成Skill的排序逻辑 - 逻辑链清晰:从Course关联到中间表,再提取Skill并排序,一步到位
- 两种写法适配不同场景,不管是展示还是后续数据操作都能覆盖
注意事项
- 在.NET Core 2.0的EF Core中,暂不支持直接在
Include/ThenInclude里对关联实体排序,投影是当前版本下最靠谱的实现方式 - 确保你的Course实体已配置
Skills导航属性,且CourseSkill中间表的多对多关系在OnModelCreating中配置正确
内容的提问来源于stack exchange,提问作者span
相关产品推荐
相关产品推荐

