我尝试在SQL Server中使用json . 我创建了一个存储过程:
CREATE PROC [Production].[pr_GetForSearchAutocomplete]
WITH ENCRYPTION
AS
BEGIN
SELECT [Code] AS 'Name'
,b.[Name] AS 'Brand'
FROM [Production].[Products] p
INNER JOIN [Production].[Brands] b on p.[BrandID] = b.[BrandID]
UNION
SELECT oe.[Name] AS 'Name'
,ob.[Name] AS 'Brand'
FROM [Production].[OriginalElements] oe
INNER JOIN [Production].[OeBrands] ob on ob.[OeBrandID] = oe.[OeBrandID]
FOR JSON PATH
END
GO
现在,我尝试在Entiry Framework中调用它 . 实体模型中的函数导入仅返回集合 . 所以<我尝试使用SqlQuery:
public async Task<string> GetForSearchAutocomplete()
{
string query = "EXEC [Production].[pr_GetForSearchAutocomplete]";
var result =string.Concat(_context.Database.SqlQuery<string>(query));
return result;
}
在Web API中,我试着像这样使用它 .
public async Task<IHttpActionResult> GetForSearchAutocomplete()
{
using (var unitOfWork = Factory.Create())
{
var result = await unitOfWork.GetForSearchAutocomplete();
return Json(result);
}
}
我得到的结果是:
"[{\"Name\":\"11111111111001\",\"Brand\":\"888\"},{\"Name\":\"\\\"YO\\\"\",\"Brand\":\"FLEETGUARD\"},{\"Name\":\"11111111111002\",\"Brand\":\"FLEETGUARD\"}
…]"
但它是一个字符串,而不是json数组,因为我认为GetForSearchAutocomplete()返回字符串 .
现在我必须在Web API中创建类并将此字符串反序列化为json数组 . 但我认为没有任何区别,并从存储过程返回一个列表并在Web API中使用 Json(myList)
.
那么,有没有其他方法可以在C#中使用json存储过程?
2 回答
您应该将SQL返回的字符串转换为对象,然后再将其返回到API结果中 .
作为反序列化对象的替代方法,只能在Json方法中再次序列化它,您可以执行以下操作:
原因是SQL返回了一个JSON字符串 .
Json()
方法将C#对象转换为JSON字符串 . 如果将JSON字符串传递给JSON转换器,浏览器/解析器会将其解释为原始JSON字符串,而不是对象 .您需要反序列化JSON获取 . 使用: