c# - 如何通过 FromSqlRaw 调用 EF Core 3.0 中的存储过程

标签 c# entity-framework entity-framework-core .net-core-3.0

我最近从 EF Core 2.2 迁移到了 EF Core 3.0。

不幸的是,我还没有找到调用返回实体的存储过程的方法。

在 EF Core 2.0 中,这是可能的:

var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc  @p0, @p1", spParams).Single();

在 EF Core 3.0 中,方法 FromSQL 被替换为 FromSqlRaw。但是,我没有设法成功调用存储过程然后处理该值。当存储过程将数据插入数据库时​​,这很有用。

所以在 EF Core 3.0 中,我使用了这段代码:

var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();

但是它会抛出异常,因为生成的 SQL 是无效的,看起来像这样:

exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
     @sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'

我尝试了很多变体,但没有成功。

我开始认为不可能使用 ModelContext.[IQueryable].FromSqlRaw 运行存储过程。在我看来,这种类型打败了 FromSqlRaw 的主要原因之一,因为对于普通的 select 语句,LINQ 通常已经足够好了。

有谁知道如何在 EF Core 3.0 中结合使用存储过程和 FromSqlRaw?非常感谢任何帮助。

提前致谢

PS:我知道您可以使用 this.Database.ExecuteSqlRaw(SQL, parameters) 执行存储过程。但是,这样就不可能检索存储过程查询的任何实体。

最佳答案

解决方案(感谢 David Browne,您应该将其作为答案发布):

用 ToList 替换 Single 有效 :-)

var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc  {0}, {1}", nodeTitle, parentPathString).ToList();

关于c# - 如何通过 FromSqlRaw 调用 EF Core 3.0 中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58207182/

相关文章:

c# - LINQ 查询以包含来自子表的一行的字段

c# - 如何使用 BindingSource 在 DataGridView 的单列中绑定(bind)导航属性(二级模型的两个属性)?

entity-framework - EF 迁移 : Rollback last applied migration?

c# - Entity Framework 核心缺乏适度的 LINQ 查询支持的最佳解决方案是什么?

c# - Audit.NET Entity Framework Core - 相关实体管理

c# - ExecuteScalar 返回 0 执行存储过程

C# 任务在using block中的返回方法

c# - 将数组加入 EF 查询

c# - 使用部分类扩展 Entity Framework 5 实体并将其映射到现有的其他实体

c# - 如何在 Web API Controller 中使用分层架构处理服务器错误