2016-05-04 8 views
0

Web APIを使用してAPIを構築しています。ここでは、JSONとしてデータベーステーブルを返します。フィルタリングのためのWeb API動的パラメータ

は、これは私のコントローラのメソッドです:

public List<ExampleDataDTO> ExampleData(int offset = 0, int limit = 0) 
{ 
    return DataAccessLayer.GetExampleData(offset, limit); 
} 

DATAACCESS方法:

public List<ExampleDataDTO> GetExampleData(int offset, int limit) 
     { 
      using (var db = new Context()) 
      { 
       db.Configuration.ProxyCreationEnabled = false; 
       var exampleQuery = db.example.AsEnumerable().Select(item => 
       new ExampleDataDTO 
       { 
        //Selects 
       }); 

       if(offset == 0 && limit == 0) 
       { 
        return exampleQuery .ToList(); 
       } 
       else 
       { 
        return exampleQuery .Skip(offset).Take(limit).ToList(); 
       } 
      } 
     } 

今ExampleDataDTOは、100以上のファイルが含まれている、と私はAPIで任意のフィールドにデータをフィルタリングすることができるようにしたいです。

動的クエリパラメータを作成する方法はありますか?例えば私がlocalhost/api/ExampleData?offset=0&limit=10&name=test1&size=test2に行くと、私はLINQコードにそれらを含めることができるように名前とサイズのキーと値を取得したいと思っています。

これは実行可能ですか?

EDIT:

IEnumerable<KeyValuePair<String, String>> queryString

は私がすべてのkeyValuePairsをループにしたラムダ式でキーを使用するにはどのような方法がありますように私はすべてのパラメータを得ることができますか? (C = c.Key ==値)はどこのような、

foreach(var queryKeyValuePair in queryString) 
{ 
    Something including Where(c => c.queryKeyValuePair.Key == queryKeyValuePair.Value) 
} 
+0

名前、テスト1、サイズ、テスト2とは何ですか? DTOオブジェクトも共有できますか? –

+0

私は、要求パラメータのさまざまな順列をすべて収容するLINQ文を作成できると確信していますが、LINQが生成しているSQLがうまく機能することを確認したい場合もあります。個人的に、これらのケースでは、私が渡す可能性のあるパラメータを受け入れ、それがさまざまな組み合わせでうまく動作することを保証するためのSQLプロシージャを作成する方が良いことが分かりました。 –

+0

あなたは 'Skip()。Take()'を使っているのが分かります。注文したリストは何ですか?要求を違う順序で、または最悪の場合には、APIのユーザーが適切に注文するように要件が変更される可能性はありますか? –

答えて

1

私が正しくあなたの質問を理解していれば、あなたはこのような何かをしたいかもしれません:

public List<ExampleDataDTO> GetExampleData(int offset = 0, int limit = 0, string name = "", string size = "") 
{ 
    using (var db = new Context()) 
    { 
     db.Configuration.ProxyCreationEnabled = false; 
     var exampleQuery = db.example 
      .Where((x => x.Name == name || name == "") && // If parameter 'name' has a value, filter on that, else ignore it. 
        (x => x.Size == size || size == "")) // If parameter 'size' has a value, filter on that, else ignore it. 
      .AsEnumerable() 
      .Select(item => 
      new ExampleDataDTO 
      { 
       //Selects 
      }); 

     if (offset == 0 && limit == 0) 
     { 
      return exampleQuery.ToList(); 
     } 
     else 
     { 
      return exampleQuery.Skip(offset).Take(limit).ToList(); 
     } 
    } 
} 

は、あなたのメソッドのパラメータをオプションにフィルタリングのためにLINQクエリでそれらを使用します。

+0

私の質問が更新されました –

1

WebAPIコントローラでODataを使用すると、filter、orderby、select、skip、top(take)を動的に適用できます。例えば

// your API action 
public IQueryable<ExampleDataDTO> Get(ODataQueryOptions opts) 
{ 
    // here is some odata settings to validate query params. 
    var settings = new ODataValidationSettings() 
    { 
     // Initialize settings as needed. 
     AllowedFunctions = AllowedFunctions.AllMathFunctions 
    }; 

    // validating parameters 
    opts.Validate(settings); 

    var yourExampleQuery = // some data from db 

    // apply all parameters that came within query to your data 
    IQueryable results = opts.ApplyTo(yourExampleQuery.AsQueryable()); 

    // and return this 
    return results as IQueryable<Product>; 
} 

そして、あなたのクエリのようなものが考えられます。すべてのクエリパラメータがODataQueryOptionsに解析し、あなたのAPI呼び出しの結果に適用されますhttp://localhost/ExampleData?$filter=SomeProperty eq 'SomeValue' $orderby=anotherProperty & $skip=10 & $top=10

希望すると助かります。

関連する問題