【问题标题】:C# stored procedure with json path带有 json 路径的 C# 存储过程
【发布时间】:2017-10-27 09:02:24
【问题描述】:

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

现在,我尝试在整体框架中调用它。实体模型中的函数导入仅返回集合。所以

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 的存储过程吗?

【问题讨论】:

    标签: c# sql-server json stored-procedures


    【解决方案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 字符串,而不是对象。

    【讨论】:

      【解决方案2】:

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

      JsonConvert.DeserializeObject<string>(result)
      

      【讨论】:

      • 我应该在哪里做这个?在 web api 中它会抛出 JsonReaderException
      • 您遇到了什么异常?也许 JSON 确实是无效的。
      • 正如我所说,_context.Database.SqlQuery 返回字符串结果,因此无法通过 throw Newtonsoft.Json.JsonReaderException 对其进行反序列化:解析值时遇到意外字符:[。路径'',第 1 行,位置 1。
      • 如果您想在返回对象之前反序列化,您需要运行JsonConvert.DeserializeObject(result)JsonConvert.DeserializeObject&lt;Array&lt;T&gt;&gt;(result),其中 T 是您的自动完成对象。我认为 Mihai 的意思是让您在客户端中运行它,这将与 &lt;string&gt; 一起使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多