2012-02-22 1 views
3

だから私のデータモデルは、このような何かを持っています。MVC4 WebAPIをチェーンコントローラに使用するにはどうすればよいですか?単一著者は、それに関連付けられた複数のブックを持つことができAuthor.Books :

私は、このルートの著者を取得できます:/ api/Authors/4 .../api/Booksや/ api/Books/8のような単行本

どのようにして1人の著者のためにすべての書籍を入手できますか?/Authors/4/Books その例の「/ Books」部分を有効にするために何が必要かわかりません。 BooksController(およびその方法)を変更しますか?またはAuthorsController?または...?

答えて

2

Web Apiの強力なOdata翻訳機能を真剣に検討する必要があります。それはあなたがLinq式に変換されるクエリ文字列内で直接豊富なクエリを構築することを可能にします。これがあなたの問題を解決する方法です。

まず、あなたの本モデルはAuthorIdプロパティを持っていることを確認してください。

public class Book 
{ 
    public string Title{get; set;} 
    public int AuthorId{get; set;} 
} 

次に、本コントローラを作成してのIQueryableを返すGetメソッドを公開:

最後に
public class BooksController : ApiController 
{ 
    public IQueryable<Books> Get() 
    { 
     var books = new List 
     { 
      new Book{Title = "Book 1", AuthorId = 1}, 
      new Book{Title = "Book 2", AuthorId = 2}, 
     }; 

     return books.AsQueryable(); 

    } 
} 

、照会します特定の著者による本のURIは次のようになります。

/books?$filter=AuthorId eq 2 
+0

私はこの方法に反対していませんがRESTのテナントに違反しているようです...? –

+0

私は同意しません。残りは、リソースと表現についてです。私たちはまだ "/ Books"リソースを使って "Book"モデルの表現を検索しています。安心して通話することができないという誤った認識が、追加のパラメータを渡すことになります。この呼び出しは、サーバー上のデータを変更した場合、安価な冪乗に違反します。それはデータをフィルタリングする方法について安心して "Get"に指示を与えるだけです。 Odataは安静になるように設計された場所を照会し、netflixのような大きな安らぎのAPIによって使用されます。 – jwanga

+0

@jwangaありがとうございます。私は、別の答えのために質問を開いたままにしておきたいと思います。おそらく誰かがその質問に対処できるようになるでしょう。そうでない場合は、私はあなたの答えを記入して喜んでください。 –

関連する問題