2016-09-02 8 views
0

私はいくつかのデータを返すWeb APIメソッドを実装しています。オファーの追加詳細を返すべきかどうか、または通常の詳細を返すべきかどうかを決定する新しいパラメータを導入するまで、それはうまく機能します。クラス名の変数をクラスの型に変換するC#

私の元のコードは、次のようなものです:私は、ストアドプロシージャを実行するためにDapperのを使用しています

using (IDbConnection conn = _context.Database.GetDbConnection()) 
       { 


       var parameters = new 
       { 
        CourseName = model.query, 
        CourseType = model.CourseType, 
        other parameters.... 
       }; 

       var obj = await conn.QueryAsync<Offering> ("SearchOfferings", parameters, commandType: CommandType.StoredProcedure); 

       if (obj == null) 
        return NotFound("Record not found"); 

       return new ObjectResult(obj); 
      } 

ここで、querystringのExtraパラメータを追加し、そのロジックを既存のコードに追加しました。 Extra = Trueの場合、異なるオブジェクトタイプでFullDetailを返します。それ以外の場合は、Briefデータのみを返します。

QueryAsync(動的パラメータ)の方法でobjectToReturn値を渡すにはどうすればよいですか?

+0

最終的なオブジェクトが実際に何をしようとしているか気にしない場合は、ダイナミックタイプを使用できます。(... –

答えて

1

Dapperのは、その可能性があります別のクエリ/ QueryAsyncメソッドのシグネチャを持っています助けてください - それぞれのオブジェクトがジェネリック型のパラメータではなくメソッドの引数で指定された型であるオブジェクトのセットを返すオブジェクトがあります。

これは、あなたがこのような何かを行うことができるようになる:

var typeToReturn = Type.GetType("MyProject.Entities.Offering"); 
var obj = await conn.QueryAsync(
    type: typeToReturn, 
    sql: "SearchOfferings", 
    param: parameters, 
    commandType: CommandType.StoredProcedure 
); 

のQueryString値は、あなたが希望のみ「公募」を指定するつもりだったので、もし型名は、所望のタイプの完全な名前でなければなりませんその実体はでどうなるか、名前空間ということを知っていると戻り値の型はIEnumerableをも持つ、もちろん

var nameOfType = "Offering"; 

const string entityNamespace = "MyProject.Entities"; 
var typeToReturn = Type.GetType(entityNamespace + "." + nameOfType); 
var obj = await conn.QueryAsync(
    type: typeToReturn, 
    sql: "SearchOfferings", 
    param: parameters, 
    commandType: CommandType.StoredProcedure 
); 

のようなものにコードを変更する必要が<オブジェクト>あなたは簡単にRETとあまり直接行うことができないことを意味しますあなたが動的に型定義されたコードを返すためのコードを書こうと思っていたのなら、それは常にそうであろう。コンパイル時にどのようなタイプが戻ってくるのか分かりません。たとえば、JSONにシリアライズするだけの場合、それは大きな問題ではありません。それは直接あなたが尋ね取り組むため、

は、私はこの答えを追加したい - 私はまた、あなたが正直気にしない場合<ダイナミック> IEnumerableを返すメソッドのシグネチャを使用して良いかもしれないサムCさんのコメントに同意しません返される型について

3

詳細な提供情報を得るためにクライアントがクエリパラメータを変更できる場合、代わりに詳細な提供情報を公開する別のリソースにアクセスすることもできます。

供物のためのあなたの現在のREST APIリソースがあるとします状の第2の1持っていないのはなぜ

http:\server.com\offerings\{id} 

http:\server.com\detailedOfferings\{id}` 

をこれも簡素化しながら使用し、理解し、あなたのRESTインタフェースが容易になります実装。

あなたが本当にクエリパラメータスイッチに固執したいなら、あなたはちょうど2つの一般的に型指定された方法のいずれかに条件付きの電話をかけることができます。

if (extra) 
    return await conn.QueryAsync<Offering>(
     "SearchOfferings", parameters, commandType: CommandType.StoredProcedure); 
else 
    return await conn.QueryAsync<BriefOffering>(
     "SearchOfferings", parameters, commandType: CommandType.StoredProcedure); 
+0

賛成です。私は2つのURLを使用すべきかどうかを判断しようとしています。または各方法のURLを区切って指定します。 http:// server.com \ offerings \ {id}、 http:// server.com \ detailedOfferings \ {id} または http: ?extra = true | false あなたが考えるなら、私は各アクションのためにURLを分けます。 – TTCG

関連する問題