.Net Core 5中Sequence contains no elements异常:部分ID请求失败排查
「Sequence contains no elements」异常并非来自FirstOrDefaultAsync()(该方法在无匹配结果时仅返回null,不会抛出此异常),问题大概率出在AutoMapper的ProjectToType<CompanyModel>映射逻辑,或是关联实体的导航属性处理环节,以下是具体排查方向:
1. 检查AutoMapper映射配置中的强制序列访问
如果CompanyModel或其关联模型(如EmployeeModel)的映射规则中,对集合类型的导航属性使用了First()、Single()这类会在空序列时抛出异常的方法,就会触发该错误。例如:
// 错误示例:若员工无Phone记录,src.Phones.First()会抛出异常 cfg.CreateMap<Employee, EmployeeModel>() .ForMember(dest => dest.PrimaryPhone, opt => opt.MapFrom(src => src.Phones.First()));
第二家公司的员工中可能存在无Phones/Emails的记录,而第一家公司的员工均有完整的关联数据,因此仅第二家公司的查询触发异常。
2. 验证关联实体的数据完整性
检查第二家公司的关联数据是否存在异常:
- 确认该公司的
Logo导航属性对应的记录是否存在于数据库中(若Company表的LogoId指向不存在的Logo记录,EF Core加载时可能引发隐性异常); - 确认该公司的员工是否存在
Phones或Emails为空集合的情况,而映射配置未处理空集合场景。
3. 逐步简化查询定位问题环节
通过逐步简化查询代码,定位异常触发的具体环节:
- 先移除所有
Include和ProjectToType,仅查询Company实体:
var company = await this.mainDbContext.Company .Where(x => x.Id == id) .FirstOrDefaultAsync() .ConfigureAwait(false);
若能正常获取到第二家公司,则问题出在后续的关联加载或投影环节。
2. 逐步添加Include(先加Logo,再依次添加Employees、Phones、Emails),每添加一个就测试接口,定位到触发异常的关联属性。
3. 恢复ProjectToType,但暂时注释掉映射配置中涉及关联集合的规则,验证是否由映射逻辑导致异常。
4. 核对接口传入的ID参数与数据库一致性
虽然你提到SQL能查询到,但需确认接口传入的id参数是否与数据库中的ID完全一致:
- 检查是否存在大小写差异(若数据库ID是区分大小写的字符串类型);
- 检查是否有多余/缺失的字符(比如你提供的第一个接口URL中ID是
008db1da9-6bcx,而SQL中是08db1da9-6bcx,需确认是否为笔误)。
5. 查看EF Core生成的SQL语句
启用EF Core日志功能,查看查询第二家公司时实际生成的SQL,对比手动执行的SQL是否一致,确认EF Core是否因关联加载逻辑过滤了目标数据。
内容的提问来源于stack exchange,提问作者Real Slim Shady 112

