我尝试在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存储过程?
答案 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字符串,而不是对象。