2011-02-18 67 views
2

使用.NET MVC開發API並以JSON格式返回結果。起初,它似乎與我從數據庫返回的結果一起工作,因爲IEnumerable然後被轉換爲JSONResult類型以返回。Linq to SQL over the zealous serialization

這個序列化hierrachy爲我和子對象加載automaticaly根據設計師的關係,併成爲JSON hierrachy的一部分。

IEnumerable<Book> books= _contentRepository.GetBooks(); 

return Json(new { 
        success = true, 
        data = new { 
           books = books 
           } 
       }, JsonRequestBehavior.AllowGet); 

這種能力也是問題,因爲有時會加載一些我不需要的子對象的整個負載。例如,假設我有一個擁有相關書籍的圖書實體,而這些相關圖書也有相關書籍,那麼這棵樹會很快變得很深。

這個裏克施特拉爾會談朝他的文章的結尾:http://www.west-wind.com/weblog/posts/147218.aspx

我還是想保持hierrachy,使JSON也hierrachical。例如book.author,book.publisher [0] .name,但我想要對查詢中加載的內容進行一些控制。

我在尋找去除設計器中的實體之間的所有鏈接,並指定查詢中的連接或查詢,並可能手動彌補由此產生的hierrachy?

回答

1

我會使用視圖模型:一個專門爲滿足視圖要求而定製的類(或者在您的情況下爲JSON結構)。然後在從數據庫中提取的模型與視圖模型之間有控制器動作map。現在你完全可以控制。

IEnumerable<Book> books = _contentRepository.GetBooks(); 
IEnumerable<BookViewModel> bookViewModels = Mapper.Map<IEnumerable<Book>, IEnumerable<BookViewModel>>(books); 
return Json(
    new { success = true, data = bookViewModels }, 
    JsonRequestBehavior.AllowGet 
); 
+0

這很好地確保只有期望的數據被返回(您是否使用Automapper),但不必要的數據首先被加載,並且可能會減慢速度)作爲主對象的子集合... – 2011-02-22 23:42:42

0

你是如何自動加載相關對象的?通常這些集合是延遲的EntitySet實例,如果它們未枚舉則不加載。你確定你有問題想要解決嗎?

+0

我的存儲庫方法正在返回IEnumerable 它也包含所有的子對象,除非我將關係標記爲dbml中的內部... – 2011-02-22 23:40:05