2016-08-12 48 views
0

Oracle DatabaseをクエリするWeb APIを、クエリパラメータの配列を受け入れ、JSON形式でResultを返すように作成しました。複数の配列をWeb 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; 
    }}}}}} 

だから、API呼び出しはhttps://localhost:4320/api/TestQuery?id=xxx&id=yyyのようだったし、結果は私がselect文にあるカラム名の配列される、APIの中で、今1つの以上の入力パラメータを追加したい{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]} でした、したがって、APIはこれらの列のみを返します。 APIはhttps://localhost:4320/api/PData?id=xxx&id=yyy&col=CATEGORY&col=SESSION_NUMBERで、列名はCATEGORYおよびSESSION_NUMBER {"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7}]}のみです。これはここで行うことができますが、私はちょうどvariableのクエリを与えているので、列名をどのように動的に選択するのか分かりません。どんな助けでも大歓迎です。

+0

あなたの質問は何ですか?コントローラーアクションでパラメーターを実行する方法は?どのようにSQLコードでそれを行うには?それがうまくいくならば? –

+0

@FrancisLordコントローラで入力パラメータとして渡される列名を選択する方法 – trx

+0

SQLコードでは? –

答えて

1

すでにサーバーに送信しているSQL文字列に列名を指定しているため、C#コードでその文字列を編集するだけで、idをwhere条件に追加するのと同様の方法があります。実際には、列名を文字列とすべてに含める必要がないので、さらに簡単になります。私がここで見るのは、エイリアスを使用して出力列の名前を変更していることだけです。これが必要な場合は、ディクショナリを使用して(出力)列名と追加する必要がある選択肢との関係を格納することをお勧めします。このような何か:次に

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

//'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 colDict = new Dictionnary<string, string>() { 
    {"CATEGORY", "STCD_PRIO_CATEGORY_DESCR.DESCR"}, 
    //... 
    {"SESSION_START_DATE", "Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE)"} 
} 

は、次に、あなただけの選択文字列を作成するためにそれを使用することができますidsとallを追加するために通常のコードに進むことができます。それがあなたが探していた理由ですね! :-)

+0

ありがとう。 selectStringは、すべてのColumn名が一緒に結合されていることを理解しています。 StrQueryと「STCD_PRIO_CATEGORY_DESCR.STD_REF IN( "はIDを保持していますので、私たちはselectStringを与えます。 – trx

+1

あなたの質問が何であるかは分かりません。文字列中の '{0}'を参照してください。通常は 'string.Format'を呼び出すと、' {#} 'インスタンスは後で与えるパラメータで置き換えられます。この場合、 '{0}'を 'selectString'の値で置き換えるように指示しています。 –

+0

これで今すぐ試してみます。もう一度お試しください。 – trx

関連する問題