2012-02-22 26 views
3

所以我的數據模型有這樣的:Author.Books 其中一個作者可以有多個關聯的書籍。我將如何使用MVC4 WebAPI鏈式控制器?

我可以用這條路線檢索作者:/ API /著者/ 4 ...我能得到像所有圖書列表:/ API /書籍,或一本書像/ API /書籍/ 8

那麼,如何獲得單個作者的所有書籍?如:/作者/ 4 /書籍 我不知道需要發生什麼才能啓用該示例的「/書籍」部分。我是否修改BooksController(以及如何)?還是AuthorsController?要麼... ?

回答

2

您應該認真考慮使用web Api的強大的Odata轉換功能。它允許您直接在querystring中構建豐富的查詢,並將其轉換爲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租戶..? – 2012-02-22 21:58:03

+0

我不同意。休息是關於資源和表示。我們仍然使用「/ Books」資源來檢索「Book」模型的表示。這是一種常見的誤解,即平靜的電話不能通過額外的參數。如果這個調用修改了服務器上的數據,它將違反平衡的冪等性。它所做的就是給出有關如何過濾數據的寧靜「獲取」的說明。 Odata查詢旨在增加休息的地方,並被netflix等大型restful api使用。 – jwanga 2012-02-22 22:47:55

+0

謝謝@jwanga。我想留下問題以獲得更多答案 - 也許有人能夠解決問題。如果沒有,我會很樂意標記你的答案。 – 2012-02-22 23:17:27