Entity Framework中如何处理存储过程返回的多结果集?
EF Core 读取存储过程多结果集实现方案
EF Core 原生的FromSqlRaw方法仅支持读取存储过程返回的第一个结果集,要获取多个结果集需要手动操作数据库连接和DataReader实现,具体代码如下:
// 第一个结果集存储集合 List<OhslotsMaster> ohslotsList = new List<OhslotsMaster>(); // 第二个结果集存储集合,替换为你实际业务对应的实体类 List<YourSecondEntity> secondResultList = new List<YourSecondEntity>(); // 复用上下文的数据库连接 using (var connection = context.Database.GetDbConnection()) { connection.Open(); using (var command = connection.CreateCommand()) { // 配置执行的存储过程和参数 command.CommandText = @"EXEC SP_CreateHosts @HostId, @ConfigId, @HostGivenName, @HostEmailAddress, @SurName, @DisplayName, @HostIsActive"; // 直接使用你已经定义好的参数集合 command.Parameters.AddRange(parms.ToArray()); using (var reader = command.ExecuteReader()) { // 读取第一个结果集 ohslotsList = context.OhslotsMasters .Translate<OhslotsMaster>(reader) .ToList(); // 跳转到第二个结果集 if (reader.NextResult()) { // 读取第二个结果集映射到对应实体 secondResultList = context.Set<YourSecondEntity>() .Translate<YourSecondEntity>(reader) .ToList(); } } } } // 之后两个集合就可以分别使用
注意事项
- 请将代码中的
YourSecondEntity替换为你第二个结果集对应的实体类,实体的属性名需要和存储过程返回的第二个结果集列名一一对应,列名和属性名不匹配的可以通过[Column]特性指定映射关系 - 若你的第二个实体没有在DbContext中定义对应的
DbSet<T>属性,也可以正常调用context.Set<YourSecondEntity>()进行转换,无需额外配置 - 需要异步调用的场景下,将所有同步方法替换为对应异步版本即可:
OpenAsync、ExecuteReaderAsync、NextResultAsync,并添加await关键字 - 如果存储过程返回超过2个结果集,重复调用
NextResult方法依次处理后续结果集即可
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

