【发布时间】:2019-04-30 05:00:04
【问题描述】:
Ciao, 我正在开发一个 Web API Core 2 项目,并且正在使用带有 SQL Azure 数据库的 Entity Framework Core 2。
其实
在 SQL Azure 数据库中,我有一个返回 JSON 的存储过程,如下所示:
CREATE PROCEDURE [dbo].[sp_Procedura]
AS
BEGIN
SET NOCOUNT ON
DECLARE @data NVARCHAR(MAX) =
(SELECT
*
FROM
dbo.Entity
FOR JSON AUTO)
select 0 as 'Id', @data as 'data'
END
实际上,要读取结果,我必须创建一个实体来映射结果并使用以下代码读取数据:
string json = myContext
.JsonResult.FromSql("exec dop.sp_Procedura")
.ToList().FirstOrDefault().data;
在实体类下面:
public class Entity
{
[Key]
public int Id { get; set; }
public string data { get; set; }
}
希望
我认为这个解决方案并不完全干净。我的存储过程应该是这样的:
CREATE PROCEDURE [dbo].[sp_Procedura]
AS
BEGIN
SET NOCOUNT ON
SELECT
*
FROM
dbo.Entity
FOR JSON AUTO
END
像以前一样有一个存储过程,使用 EF Core 2.0 有没有办法像下面的伪代码一样读取 JSON 结果?
string json = myContext.FromSql("exec dbo.sp_Procedura").Result;
谢谢你
【问题讨论】:
-
您不需要 EF 来返回单个字符串。 Dapper 在这里是一个更好的选择。
-
为什么还要在服务器上生成JSON?在使用 JSON.NET 的客户端上这样做更容易。只有当您有一个复杂的查询需要查询多个表并在客户端构建一个复杂的图形时,您才需要
FOR JSON -
Ciao,@PanagiotisKanavos 我同意你的观点,但出于内部政策,我不能使用 Dapper。关于您的第二条评论,我已经简化了场景,我需要使用 FOR JSON,因为我的存储过程构建了我的实体图。
-
如果您不能使用 Dapper,请使用 DbContext 的连接使用普通的旧 SqlCommand。
-
我喜欢这种解决方案,我不知道这种可能性。我会试试的。
标签: c# tsql entity-framework-core-2.1