使用实体框架核心2将原始SQL映射存储过程结果发送到POCO / DTO

时间:2018-03-28 03:33:48

标签: stored-procedures asp.net-core ef-core-2.0

我几乎可以随处查看,而且我很难找到解决方案。我花了一个星期的时间使用存储过程创建了一个非常复杂的计算查询,我想从这个查询中获取结果并放入POCO类,类似于我在使用EF之前所做的事情。 6。

Map Stored Procedure Column names to POCO DTO

基本上这个:

var p1 = new SqlParameter { ParameterName = "Param1", Value = 1 };
var p2 = new SqlParameter { ParameterName = "Param2", Value = 2 };
string query = "EXEC Calcs_Selections @Param1, @Param2";
var calcs = context.Database.SqlQuery<CalcViewPOCO>(query, p1, p2).ToList();

我读过这里的文献:

EF Core Querying Raw SQL

Raw SQL Query without DbSet - Entity Framework Core

并且发现没有更多&#34;免费sql&#34;在EF Core中了。 FromSQL基本上将结果投影到数据库中的实体中,我不想要这样,因为我没有找到具有相同列的表。相反,一种解决方案是扩展DBContext,并创建一个新的DBSet

但我真的不知道该怎么做。我有一个数据库第一个模型,并使用了Scaffold-DbContext:

Getting Started with EF Core on ASP.NET Core with an Existing Database

我不想添加自动创建的上下文,在我的案例中是ProjectAContext,因为如果我对数据库进行了更多更改,并再次运行scaffolding,它将覆盖我的更改。

1 个答案:

答案 0 :(得分:2)

虽然我不能再等待新版本的EF Core为我提出的功能添加功能,但我找到了一个帮助我解决这个问题的库。

https://github.com/snickler/EFCore-FluentStoredProcedure

它允许我拍摄结果集,并映射到DTO列表。

回购中显示的样本:

 var dbContext = GetDbContext();
  dbContext.LoadStoredProc("dbo.SomeSproc")
           .WithSqlParam("fooId", 1)              
           .ExecuteStoredProc((handler) =>
            {                  
                var fooResults = handler.ReadToList<FooDto>();      
                // do something with your results.
            });