Entity Framework Core 2.0执行存储过程获取单个返回值方案咨询
在EF Core中获取存储过程返回的单个值的解决方案
嗨,我之前刚好遇到过完全一样的场景——调用只返回单个值(比如SELECT 'somevalue')的存储过程,一开始也踩了ExecuteSqlCommand的坑,它确实只适合执行增删改这类返回受影响行数的操作。下面给你两个亲测有效的替代方案:
方案一:使用FromSqlRaw/FromSqlInterpolated映射到临时DTO
这个方法贴合EF Core的常规查询流程,只需要先定义一个极简的DTO来接收返回值:
// 定义仅用于接收单个返回值的DTO(无需映射到数据库实际表) public class SingleValueResult { public string Value { get; set; } }
接着在你的DbContext中添加对应的DbSet:
public DbSet<SingleValueResult> SingleValueResults { get; set; }
之后就可以调用存储过程并提取结果了:
// 无参数的情况 var result = await context.SingleValueResults .FromSqlRaw("EXEC YourStoredProcedureName") .Select(s => s.Value) .FirstOrDefaultAsync(); // 有参数的情况,用FromSqlInterpolated避免SQL注入 var inputParam = "yourParameterValue"; var resultWithParam = await context.SingleValueResults .FromSqlInterpolated($"EXEC YourStoredProcedureName @InputParam={inputParam}") .Select(s => s.Value) .FirstOrDefaultAsync();
方案二:直接使用ExecuteScalar获取第一行第一列的值
如果不想额外定义DTO,这个方法更直接,绕过EF的实体映射,直接通过数据库连接执行命令:
using var connection = context.Database.GetDbConnection(); await connection.OpenAsync(); using var command = connection.CreateCommand(); command.CommandText = "YourStoredProcedureName"; command.CommandType = System.Data.CommandType.StoredProcedure; // 有参数时添加参数(必须用参数化方式,杜绝SQL注入) command.Parameters.Add(new SqlParameter("@InputParam", "yourParameterValue")); // 执行并获取结果,返回的是object类型,按需转换 var resultObj = await command.ExecuteScalarAsync(); var result = resultObj?.ToString(); // 若返回数值类型,可转成int/decimal等
小提醒
- 不管用哪种方法,参数化查询是必须的,绝对不要直接拼接字符串传递参数,避免SQL注入风险。
- 如果存储过程返回的是数值类型(比如int、decimal),记得把DTO属性或转换后的类型改成对应的值类型。
内容的提问来源于stack exchange,提问作者Pradeep H
相关产品推荐
相关产品推荐

