Entity Framework 6执行多记录集存储过程获取强类型集合方法咨询
EF 6 执行多结果集存储过程并复用内置映射逻辑方案
完全可以复用EF内置的实体映射逻辑,不需要手动编写字段解析代码,核心依赖EF 6提供的Translate方法实现,具体方案如下:
实现原理
EF 6的ObjectContext封装了成熟的结果集映射逻辑,Translate方法可以直接读取DbDataReader的数据流,按照你已配置的实体映射规则(包括特性标注、Fluent API配置)自动映射为强类型实体集合,完美实现查询执行逻辑和解析逻辑的解耦。
代码实现示例
假设你需要调用的存储过程名为GetUserRelatedData,会依次返回UserInfo、UserOrder、UserAddress三个结果集,示例代码如下:
using (var db = new YourCustomDbContext()) { // 复用EF上下文的数据库连接,不需要单独维护连接字符串 db.Database.Connection.Open(); var sqlConn = db.Database.Connection as SqlConnection; // 构造存储过程调用命令 var cmd = new SqlCommand("GetUserRelatedData", sqlConn); cmd.CommandType = System.Data.CommandType.StoredProcedure; // 按需添加存储过程入参 cmd.Parameters.Add(new SqlParameter("@UserId", 1001)); using (var reader = cmd.ExecuteReader()) { // 映射第一个结果集 var userList = ((IObjectContextAdapter)db).ObjectContext .Translate<UserInfo>(reader).ToList(); // 跳转到下一个结果集 reader.NextResult(); // 映射第二个结果集 var orderList = ((IObjectContextAdapter)db).ObjectContext .Translate<UserOrder>(reader).ToList(); reader.NextResult(); // 映射第三个结果集 var addressList = ((IObjectContextAdapter)db).ObjectContext .Translate<UserAddress>(reader).ToList(); // 有更多结果集重复执行NextResult + Translate即可 } }
注意事项
- 如果不需要映射得到的实体被EF上下文跟踪,可以传入
MergeOption.NoTracking参数提升性能:
其中第二个参数为你.Translate<UserInfo>(reader, "UserInfos", MergeOption.NoTracking)DbContext中对应DbSet的属性名,用于关联预设的映射规则。 - 该方案仅适配EF 6,EF Core的多结果集处理逻辑存在差异,你当前的技术栈可以直接复用上述代码。
- 不需要手动关闭数据库连接,上下文
using块释放时会自动回收连接资源。
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

