[英]How to get WebAPI to return JSON for SQL query with varying select clause
我的应用程序具有查询生成器,该查询生成器允许用户使用变化的select子句创建SQL查询。 我需要WebAPI以JSON返回结果。 选择中可能包含大量字段。
我发现的唯一方法是使用:
var results = db.Database.SqlQuery<SomeObjectWhichDefinesAllPossibleFields>(sql);
return Ok(results);
这依赖于我维护一个SomeObjectWhichDefinesAllPossibleFields类,该类按其名称建议执行。 我希望有一个更动态的解决方案,因为将来可能会添加更多字段。
是否有另一种方法来使WebAPI使用变化的select子句序列化SqlQuery
Web Api存储库可以使用此:
public IList<Models.SalesTargetDetail> getSalesTarget(int SpId){
System.Text.StringBuilder sbSql = new System.Text.StringBuilder();
sbSql.Append(@"select Cast(STD.Qty as varchar(10)) as Qty from tblSalesTarget ST inner join tblSalesTargetDetail STD on ST.Id=STD.SalesTargetId where 1=1");
sbSql.Append(" and STD.SalesTargetId=" + SpId);
var data = this.UnitOfWork.Context.Database.SqlQuery<Models.SalesTargetDetail>(sbSql.ToString()).ToList<Models.SalesTargetDetail>();
return data.ToList<Models.SalesTargetDetail>();
}
模型是:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
namespace NNG.NCPML.Api.Models{
//[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class SalesTargetDetail{
public int SalesTargetDetailId{get; set;}
public string SalesTargetId{get; set;}
public int ItemInfoId{get; set;}
public string ItemName{get; set;}
}
}
在WebAPI中,可以禁止对null字段进行序列化 。 因此,您可以从可怕的SomeObjectWhichDefinesAllPossibleFields
类开始,将所有属性初始化为null,然后仅设置select子句中要求的属性。 您仍然必须维护大型类,但是如果仅选择/请求两个字段,则只有两个字段将被序列化并在JSON结果中返回。
您还可以使用ExpandoObject,将其转换为IDictionary,并根据请求的字段动态添加属性。 这是一个例子:
示例API网址: http:// localhost / api / select / id,title,firstName,lastName
( using System.Dynamic;
添加using System.Dynamic;
)
[Route("api/select/{fieldList}")]
[HttpGet]
public object Dynamic(string fieldList)
{
dynamic expando = new ExpandoObject();
var dictionary = expando as IDictionary<string, Object>;
string[] fields = fieldList.Split(',');
foreach (var field in fields)
{
dictionary.Add(field, "code to get the field value goes here");
}
return expando;
}
最后,根据此http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery,我使用TypeBuilder构造了一个动态Type传递给SqlQuery方法
Web-api将此动态类型很好地序列化为JSON。
唯一的限制是,有必要知道动态字段类型(无论是字符串,int等),但是在我的应用程序中是可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.