ASP.NET Core MVC EF使用FromSqlRaw无数据时报错:Sequence contains no elements
解决EF Core FromSqlRaw无记录时抛出“Sequence contains no elements”的问题
你的问题出在LINQ方法的选择上——当前泛型方法里应该用了First()或Single()这类会强制要求序列必须存在元素的方法,当查询无返回记录时,这类方法就会抛出Sequence contains no elements异常。
要实现无记录时返回空模型的需求,只需要把这些方法替换成FirstOrDefault()或SingleOrDefault()即可,这两个方法在序列为空时会返回对应类型的默认值(引用类型返回null,值类型返回对应默认值如0、false等)。
错误写法示例
public T ExecuteGenericRow<T>(string sql, params object[] parameters) where T : class { // 无记录时会抛出Sequence contains no elements return _context.Set<T>().FromSqlRaw(sql, parameters).First(); }
修正后的写法
// 用FirstOrDefault()替代First(),返回可空的泛型类型 public T? ExecuteGenericRow<T>(string sql, params object[] parameters) where T : class { return _context.Set<T>().FromSqlRaw(sql, parameters).FirstOrDefault(); }
额外注意事项
- 如果你的泛型类型是值类型(比如
int、DateTime),FirstOrDefault()会返回值类型的默认值而非null。如果需要返回null,要调整泛型约束并使用可空值类型:public T? ExecuteGenericRow<T>(string sql, params object[] parameters) where T : struct { return _context.Set<T>().FromSqlRaw(sql, parameters).FirstOrDefault(); } - 逻辑区分:如果你的查询业务规则确保最多返回一条记录,用
SingleOrDefault()更贴合语义;如果允许多条记录且只取第一条,用FirstOrDefault()更高效。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

