You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:42:34