首页 文章

带有json路径的C#存储过程

提问于
浏览
0

我尝试在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 回答

  • 1

    您应该将SQL返回的字符串转换为对象,然后再将其返回到API结果中 .

    var result = await unitOfWork.GetForSearchAutocomplete();
    
    var obj = JsonConvert.DeserializeObject(result);
    // or
    // var obj = JsonConvert.DeserializeObject<Array<T>>(result)
    
    return Json(obj);
    

    作为反序列化对象的替代方法,只能在Json方法中再次序列化它,您可以执行以下操作:

    var result = await unitOfWork.GetForSearchAutocomplete();
    return Content(result, "application/json");
    

    原因是SQL返回了一个JSON字符串 . Json() 方法将C#对象转换为JSON字符串 . 如果将JSON字符串传递给JSON转换器,浏览器/解析器会将其解释为原始JSON字符串,而不是对象 .

  • 1

    您需要反序列化JSON获取 . 使用:

    JsonConvert.DeserializeObject<string>(result)
    

相关问题