EF Core 5 查询包含全部指定技能ID的员工时查询无法翻译如何解决
报错原因
你之前的两种写法无法被EF(Entity Framework)翻译为原生SQL,核心原因是EF不支持直接对内存中的集合对象(filter.SkillIds)执行All遍历、跨集合Intersect交运算这类操作的SQL转译。
正确实现方案
兼容性最好、性能最优的实现方式是动态叠加筛选条件,该写法支持所有EF/EF Core版本,生成的SQL执行效率也很高:
// 先判断要求的技能ID列表是否为空,为空则不需要加筛选条件 if (filter.SkillIds?.Any() == true) { // 可选:如果技能ID列表可能存在重复值,先去重避免生成冗余SQL var distinctSkillIds = filter.SkillIds.Distinct().ToList(); foreach (var requiredSkillId in distinctSkillIds) { // 逐个添加条件:员工必须持有当前要求的技能 query = query.Where(e => e.Skills.Any(skill => skill.Id == requiredSkillId)); } } // 执行查询即可得到符合要求的员工 var matchedEmployees = query.ToList();
实现说明
该写法会被EF翻译为多个EXISTS子查询叠加的SQL语句,多个条件同时满足就等价于员工持有全部要求的技能,完全匹配你的需求,不存在翻译失败的问题。
内容的提问来源于stack exchange,提问作者Nikita Ivanov
相关产品推荐
相关产品推荐

