Entity Framework 6 中具有多个记录集的存储过程

Posted

技术标签:

【中文标题】Entity Framework 6 中具有多个记录集的存储过程【英文标题】:Stored procedure with multiple recordsets in Entity Framework 6 【发布时间】:2021-12-23 09:35:09 【问题描述】:

ASP.NET Core 6 Web API、EF 6、C#、SQL Server 2019。我知道如何执行返回记录集的存储过程,利用模型映射,并获取填充的强类型对象集合对应记录。生活如此美好。

有没有办法执行返回多个记录集并接收强类型记录对象集合的存储过程?

我知道如何做到这一点没有实体框架(例如,旧学校 SqlDataAdapter / Dataset,或通过 DataReader 手动解析记录)。

也许有一种方法可以以某种方式将记录集解析逻辑与 EF 中的查询执行逻辑分离,手动执行后者,然后从一系列 DataReader 中填充记录集合?

【问题讨论】:

【参考方案1】:

如果您只需要将查询结果映射到您不需要的对象,则需要像 EF Core 6 这样的全功能 ORM。您可以使用像 Dapper 这样的微 ORM 来映射查询结果直接指向对象。

在最常见的情况下,您可以将查询的结果映射到对象,甚至可以使用以下参数:

var sql="select * from Products where CategoryId=@category";
var products=connection.Query<Product>(sql,new category=123);

您还可以映射多个结果:

var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new id=selectedId))

   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...

【讨论】:

以上是关于Entity Framework 6 中具有多个记录集的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

首先使用 Entity Framework 6 代码访问 Oracle Synonyms

Entity Framework 6 深度复制/克隆具有动态深度的实体

Entity Framework Core 2.1 无法更新具有关系的实体

entity framework 6 添加实体必须用设计器拖吗

优化多个 LINQ to Entity Framework 查询

Entity Framework 6 0.1 到 0.1 与 fluent api 的关系