C# 如何使用可变select子句让WebAPI为SQL查询返回JSON

C# 如何使用可变select子句让WebAPI为SQL查询返回JSON,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我的应用程序有一个查询生成器,允许用户使用不同的select子句创建SQL查询。我需要WebAPI以JSON格式返回结果。 select中可能包含大量字段。 我发现的唯一方法是使用: var results = db.Database.SqlQuery<SomeObjectWhichDefinesAllPossibleFields>(sql); return Ok(results); var results=db.Database.SqlQuery(sql); 返回Ok(结果);

我的应用程序有一个查询生成器,允许用户使用不同的select子句创建SQL查询。我需要WebAPI以JSON格式返回结果。 select中可能包含大量字段。
我发现的唯一方法是使用:

var results = db.Database.SqlQuery<SomeObjectWhichDefinesAllPossibleFields>(sql);
return Ok(results);
var results=db.Database.SqlQuery(sql);
返回Ok(结果);
这依赖于我维护一个SomeObjectWhichDefinesAllPossibleFields类,该类按照其名称进行操作。我想要一个更动态的解决方案,因为将来可能会添加更多字段


是否有另一种方法可以让WebAPI使用WebAPI中的可变select子句序列化SqlQuery,您可以这样做。因此,您可以从可怕的
SomeObjectWhichDefinesAllPossibleFields
类开始,将所有属性初始化为null,并仅设置select子句中请求的属性。您仍然需要维护这个大类,但是如果您只选择/请求两个字段,那么JSON结果中将只序列化并返回两个字段。

您还可以使用ExpandoObject,强制转换为IDictionary,并根据请求的字段动态添加属性。以下是一个例子:

API Url示例:

(使用System.Dynamic添加

[路由(“api/select/{fieldList}”)]
[HttpGet]
公共对象动态(字符串字段列表)
{
动态expando=新的ExpandoObject();
var dictionary=expando作为IDictionary;
string[]fields=fieldList.Split(',');
foreach(字段中的变量字段)
{
Add(字段,“获取字段值的代码在此显示”);
}
返回expando;
}

最后,我使用TypeBuilder构建了一个动态类型,并按照下面的方法传递给SqlQuery方法

此动态类型通过web api很好地序列化为JSON


唯一的限制是需要知道动态字段类型(无论是字符串、int等),但是在我的应用程序中,这是可能的。

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>();
}

试试OData和/或Breeze,我的情况也一样。下面是这篇文章。我不清楚如何使用此方法检索查询结果。请将代码格式设置为代码,方法是将其粘贴到答案中,然后按CTRL+K或
{}
按钮。避免使用代码截图。这并不能回答问题。对于查询数据库这样的简单任务,这个解决方案似乎设计得过于复杂。
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;}
    }
}