Entity Framework Core 2中如何调用存储过程返回int数组/列表?
在Entity Framework Core 2中调用返回整数数组/列表的存储过程
当然可以实现!你遇到的问题是因为context.<entities>.FromSql()要求返回结果必须能完整映射到对应的实体类(包括所有非空字段),而你的存储过程只返回整数,和现有实体结构不匹配,所以才会报错。这里给你两个亲测有效的解决方案:
方案一:使用临时实体类映射结果
EF Core 2虽然不支持无实体直接查询,但可以定义一个极简的临时类来接收存储过程的返回值,具体步骤如下:
- 定义一个只包含整数属性的临时类:
public class IntResult { // 属性名要和存储过程返回的列名对应,如果存储过程返回列名为Id,这里就叫Id public int Value { get; set; } }
- 在你的DbContext中添加对应的
DbSet(不需要为这个类创建数据库表,只是用来做查询映射):
public class YourDbContext : DbContext { // 其他实体DbSet... public DbSet<IntResult> IntResults { get; set; } // 可选:如果不想让EF Core为这个类生成迁移,可在OnModelCreating里配置 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<IntResult>().HasNoKey(); // EF Core 2.1+支持,2.0版本可忽略此配置 } }
- 调用存储过程并提取整数列表:
var paramValue = "你的参数值"; var integerList = context.IntResults .FromSql("EXEC YourStoredProcedureName @Param = {0}", paramValue) .Select(result => result.Value) .ToList();
方案二:直接使用ADO.NET原生调用
如果不想定义临时类,也可以绕过EF Core的映射,直接用底层的ADO.NET来执行存储过程,这种方式更灵活:
var integerList = new List<int>(); var paramValue = "你的参数值"; using (var command = context.Database.GetDbConnection().CreateCommand()) { command.CommandText = "YourStoredProcedureName"; command.CommandType = System.Data.CommandType.StoredProcedure; // 添加存储过程需要的参数 var parameter = command.CreateParameter(); parameter.ParameterName = "@Param"; parameter.Value = paramValue; command.Parameters.Add(parameter); // 打开连接并执行读取 context.Database.OpenConnection(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { // 假设存储过程返回的第一列是整数,根据实际情况调整索引 integerList.Add(reader.GetInt32(0)); } } }
这两种方法都能解决你的问题,如果你只是偶尔调用这类存储过程,方案二更轻便;如果经常用到,方案一的代码可读性更好。
内容的提问来源于stack exchange,提问作者Matthew Flynn
相关产品推荐
相关产品推荐

