在控制器MVC中返回json路径

时间:2017-08-26 00:51:26

标签: c# json entity-framework

我有一个返回json路径的存储过程:

GO

alter PROCEDURE [dbo].[usp_getjsondata](


@type  INT                 

)
AS
BEGIN

SELECT
          [Time] as 'Time',
          cast([Value] as varchar(10)) as 'Value'
      FROM [dbo].[tbl_data] where type = @type
      for JSON PATH

END

存储过程返回以下内容:  Result

在控制器中,我编写了以下代码:

var json = entities.Database.SqlQuery("exec usp_getjsondata  @type",
               new SqlParameter("@type", type)
        ).ToList();

json数据未存储在变量json中。 我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:0)

向坚持此事的任何人发布我的答案,

FOR JSON将返回包含JSON格式结果的nvarchar(max)字段的单个记录。

string json = string.Concat(entities.Database.SqlQuery("exec usp_getjsondata  @type",
    new SqlParameter("@type", type)
));

您可以将其转换回对象列表,然后您需要解析JSON:

var results = JsonConvert.DeserializeObject<IList<Class>>(json);

但是,如果想要这样做,那么最好从存储过程中删除FOR JSON,并将结果直接加载到列表中:

var results = entities.Database.SqlQuery<Class>("exec usp_getdata @type",
    new SqlParameter("@type", type)
).ToList();

答案 1 :(得分:0)

我正在寻找 somiting 来帮助初学者了解此解决方案并帮助更多人解决此问题。这是抽象工厂以帮助轻松使用 FOR JSON PATH 的完整解决方案(我希望)。

namespace DB {
    public class DbFactory
    {
        public static T ExecForJson<T>(string query, params object[] parans) where T : new()
        {
            var obj = new T();

            using (var db_ = new DbEntities())
            {

                obj = ExecForJson<T>(db_, query, parans);}
            
            
            return obj;
        }
        
        public static T ExecForJson<T>(DbEntities db_, string query, params object[] parans) where T : new()
        {
            var json = string.Concat(db_.Database.SqlQuery<string>(query, parans).ToList());

            if (string.IsNullOrEmpty(json)) return new T();

            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
        }

        public static System.Data.SqlClient.SqlParameter Param(string name, object value)
        {
            return new System.Data.SqlClient.SqlParameter(name, value);
        }
    }
}

像这样使用:

var id = 123;
//like this (create new instance)
var itens = DB.DbFactory.ExecForJson<List<Item>>("SELECT  * FROM Items WHERE ID = @ID FOR JSON PATH;", DB.DbFactory.Param("@ID", id));

//or like this (with current instance)
var itens = DB.DbFactory.ExecForJson<List<Item>>(db, "SELECT  * FROM Items WHERE ID = @ID FOR JSON PATH;", DB.DbFactory.Param("@ID", id))