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

时间:2017-10-27 09:02:25

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

我尝试在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 个答案:

答案 0 :(得分:1)

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

JsonConvert.DeserializeObject<string>(result)

答案 1 :(得分:1)

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

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

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

Json()

原因是SQL返回了一个JSON字符串。 import { NgModule, ApplicationRef, ComponentRef } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component.js'; import { SrcComponent } from './src.component.js'; const components = [AppComponent, SrcComponent]; @NgModule({ imports: [BrowserModule], declarations: components, entryComponents: components }) export class AppModule { modName: any = null; constructor() { this.getModuleName(components); } getModuleName(srcCom: any[]) { var myVar = {}; for (let i = 0; i < srcCom.length; i++) { myVar = srcCom[i]; // Here I am trying to access fields from different componet this.title = myVar.title; this.modName = myVar._moduleName; console.log(myVar); } console.log(myVar); return srcCom; } ngDoBootstrap(appref: ApplicationRef) { appref.bootstrap(AppComponent); appref.bootstrap(SrcComponent); } } 方法将C#对象转换为JSON字符串。如果将JSON字符串传递给JSON转换器,浏览器/解析器会将其解释为原始JSON字符串,而不是对象。