多个数组作为Web API的输入参数

时间:2016-08-12 12:42:17

标签: c# sql asp.net-mvc oracle asp.net-web-api

我们创建了Web API,通过接受查询参数数组并以JSON格式返回结果来查询Oracle DB。

Hello World.
Are we there yet?
Let's go home, now!

因此,API调用与public class TestQueryController : ApiController { public HttpResponseMessage Getdetails([FromUri] string[] id) { List<OracleParameter> prms = new List<OracleParameter>(); string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString; using (OracleConnection dbconn = new OracleConnection(connStr)) { var inconditions = id.Distinct().ToArray(); var srtcon = string.Join(",", inconditions); DataSet userDataset = new DataSet(); var strQuery = @"SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE from STCD_PRIO_CATEGORY where STCD_PRIO_CATEGORY_DESCR.STD_REF IN("; StringBuilder sb = new StringBuilder(strQuery); for(int x = 0; x < inconditions.Length; x++) { sb.Append(":p" + x + ","); OracleParameter p = new OracleParameter(":p" + x,OracleDbType.NVarchar2); p.Value = inconditions[x]; prms.Add(p); } if(sb.Length > 0) sb.Length--; strQuery = sb.ToString() + ")"; using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) { selectCommand.Parameters.AddRange(prms.ToArray()); using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) { DataTable selectResults = new DataTable(); adapter.Fill(selectResults); var returnObject = new { data = selectResults }; var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); ContentDispositionHeaderValue contentDisposition = null; if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition)) { response.Content.Headers.ContentDisposition = contentDisposition; } return response; }}}}}} 类似,结果为https://localhost:4320/api/TestQuery?id=xxx&id=yyy 我想在API中再添加一个输入参数,它将是select语句中的列名数组,因此API将只返回那些列。 API将{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]}仅返回列名CATEGORY和SESSION_NUMBER https://localhost:4320/api/PData?id=xxx&id=yyy&col=CATEGORY&col=SESSION_NUMBER。这可以在这里完成,我不知道我们将如何动态选择列名称,因为我们只是在{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7}]}中提供查询。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于您已经在发送到服务器的SQL字符串中指定了列名,因此您可以在C#代码中编辑该字符串,方法与将条件添加到where条件的方式类似。它实际上更容易,因为您不需要将列名称包括为字符串和全部。我在这里看到的唯一一件事是您使用别名来更改输出列的名称。如果有必要,我建议使用字典来存储(输出)列名称和需要添加的选择之间的关系。像这样:

var colDict = new Dictionnary<string, string>() {
    {"CATEGORY", "STCD_PRIO_CATEGORY_DESCR.DESCR"},
    //...
    {"SESSION_START_DATE", "Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE)"}
}

然后您可以使用它来创建选择字符串:

//'columns' is the parameter from the query string

List<string> selectionStrings = new List<string>();
foreach (string col in columns)
{
    string selector = colDict[col];
    selectionStrings.Add(string.Format("{0} AS {1}", selector, col));
}

string selectString = string.Join(', ', selectionStrings);

然后你可以把它放到你的实际SQL字符串中:

var strQuery = string.Format(
    @"SELECT {0}         
    from STCD_PRIO_CATEGORY
    where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(",
    selectString);

然后,您可以继续使用常规代码添加ID和所有内容。希望这就是你要找的原因! : - )