从.NET WebApi迁移至.NET Core API:如何在Entity Framework Core调用带参数存储过程时使用FirstOrDefault()获取首个值
解决EF Core调用存储过程获取FirstOrDefault结果的问题
首先得指出你当前代码的核心问题:ExecuteSqlRaw方法返回的是执行SQL语句后受影响的行数,不是存储过程查询出来的ApproverCode值,所以你之前把它转成字符串拿到的其实是行数,完全不是你想要的结果。
要获取存储过程返回的第一个ApproverCode,可以根据你的EF Core版本选择下面的方案:
方案1:定义结果类配合FromSqlRaw(适用于所有EF Core版本)
首先创建一个类来接收存储过程的返回结果,属性名要和存储过程返回的列名完全匹配:
public class ApproverResult { public string ApproverCode { get; set; } }
然后修改你的方法,用FromSqlRaw执行存储过程并获取结果:
public string GetApproverId(int ReqId) { var reqIdParam = new SqlParameter("@DelReqId", ReqId); // 调用存储过程并获取第一个结果 var approverResult = db.Set<ApproverResult>() .FromSqlRaw("exec LMS.CDS_GetApproverSAPIDOnReqId @DelReqId", reqIdParam) .FirstOrDefault(); // 如果结果为空,返回空字符串,否则返回ApproverCode return approverResult?.ApproverCode ?? ""; }
方案2:直接返回标量值(适用于EF Core 7.0+)
EF Core 7.0及以上版本新增了Database.SqlQuery<T>方法,可以直接返回标量类型或简单类型,不需要额外定义结果类:
public string GetApproverId(int ReqId) { var reqIdParam = new SqlParameter("@DelReqId", ReqId); // 直接调用存储过程并获取第一个字符串结果 var approverCode = db.Database.SqlQuery<string>( "exec LMS.CDS_GetApproverSAPIDOnReqId @DelReqId", reqIdParam) .FirstOrDefault(); // 空值处理,返回空字符串 return approverCode ?? ""; }
额外注意事项
- 确保参数名
@DelReqId和存储过程里的参数名完全一致,避免参数绑定失败 - 如果存储过程可能返回多行结果,
FirstOrDefault()会自动取第一行;如果没有匹配结果,会返回null,所以我们用?? ""来兜底返回空字符串,和你存储过程里的isnull(ApproverCode,'')逻辑保持一致
内容的提问来源于stack exchange,提问作者Srinivasarao
相关产品推荐
相关产品推荐

