我有一个返回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
存储过程返回以下内容:
在控制器中,我编写了以下代码:
var json = entities.Database.SqlQuery("exec usp_getjsondata @type",
new SqlParameter("@type", type)
).ToList();
json数据未存储在变量json中。 我在这里错过了什么吗?
答案 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))