2010-09-28 42 views
2

在MVC視圖中,我正在尋找一種方法來確定父實體的子實體集合是否爲空,所以我可以決定是否需要調用RenderPartial()或不。實體框架4 - 檢查導航屬性集合是否爲空,沒有包含()或加載()

對於一到一個我一直在使用下列內容:

<% if (Model.Book.GenreReference.EntityKey != null) %> 
    {.....} 

,但我不確定如何做到這一點的一個一對多的情況下,或者如果它甚至可以在不使用Include()或Load()的情況下完成

回答

2

寫視圖模型:

public class BookPresentation 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public bool HasOrders { get; set; } 
    public int ReviewCount { get; set; } 
} 

然後project到它:

var model = from b in db.Books 
      where b.Id == id 
      select new BookPresentation 
      { 
       Id = b.Id, 
       Title = b.Title, 
       HasOrders = b.Orders.Any(), 
       ReviewCount = b.Reviews.Count() 
      }; 
+0

快活的好。我喜歡這個。除非我必須像其他回答者所暗示的那樣,否則我不想加載特定的集合,這種情況是不尋常的嗎? – asfsadf 2010-09-28 18:25:21

+1

我不這麼認爲。像「你真的應該從你的模型傳遞到視圖時從數據庫加載所有數據」的意見偶爾意味着「我不知道如何在適當的時候處理我的ObjectContext',這完全是另一回事。 – 2010-09-28 18:57:09

+1

實際上暗示的是從視圖內查詢數據庫不是一個好習慣(我認爲你會同意這一點)。 – Yakimych 2010-09-28 20:46:37

0

首先,當模型傳遞到視圖時,您應該確實擁有從數據庫加載的所有數據。鑑於此,您應該在查詢中使用了Include(或之後的Load)以獲取控制器操作中的子集合。

在視圖中,然後做一個平常檢查(沿東西線):

<% if (Model.Book.Children != null && Model.Book.Children.Any()) %> 

(而不是Children你實際使用你的導航屬性 - 可能是Authors爲例)。

+0

謝謝Yakimych,但我希望以避免加載集合,如果我不需要它。 – asfsadf 2010-09-28 18:26:51