繁体   English   中英

如何获取WebAPI以使用不同的select子句为SQL查询返回JSON

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM