2011-07-05 47 views
4

我正在製作一個關於asp.net MVC的網站,我正在使用存儲庫接口在內存中使用存儲庫並使用數據庫。有關包含方法在實體框架中的問題

我有我所有的關係固定起來,我的意思是例如當我有一個聯繫人比他有地址,所以..當我添加一個地址到這個聯繫人自動修復地址重新接觸點接觸點聯繫,我離開屬性虛擬爲實體框架創建代理,然後使用數據庫存儲庫。

我的問題從這裏開始:

我有一個這樣的查詢:

return query.Where(c => c.UserID == clientId) 
         .Include(c => c.AssignedProjects) 
         .Select(c => new UserDetailsData<Client> 
         { 
          User = c, 
          IssuesCount = c.IssuesReported.Count() 
         }).Single(); 
使用包括

。 如果我刪除Select assignedProjects將包含此客戶端的項目,但是當我包含Select AssignedProjects時爲null並且匿名對象很好但是..用戶不包含任何AssignedProjects。

在記憶中,我可以做到這一點,但使用EF我不能。

我想要的最終圖是..用戶與clientID具有集合AssignedProjects與他的項目並創建匿名對象與用戶(具有集合)和IssuesCount傳遞到視圖以顯示AssignedProjects,用戶信息和客戶報告的問題數量。

任何人都知道我可以解決這個問題嗎?

+0

老實說,這可能是完全錯誤的,但我通過並認爲我會給它一個鏡頭。嘗試使用AsQueryable()或許在include和select之間工作。讓我知道,如果這對你做任何事情:P。 – OpticalDelusion

回答

0

你可以試試這個:

return query.Where(c => c.UserID == clientId) 
      .Select(c => new UserDetailsData<Client> 
      { 
       User = c, 
       AssignedProjects = c.AssignedProjects, 
       IssuesCount = c.IssuesReported.Count() 
      }).Single(); 

雖然你對你投入的類型的AssignedProjects屬性並不真正感興趣,它也會填充User.AssignedProjects屬性。這利用了「關係範圍」,這是EF中的一項功能,可以自動構建加載到上下文中的對象的導航屬性。

請注意,這確實取決於您將對象加載到上下文中的事實。如果您禁用了跟蹤功能 - 例如在查詢中使用AsNoTracking(),則該功能不再有效。

+0

這段代碼工作得很好,但我總是需要擔心這種情況(與包含投影)和我的看法我不能使用集合指針穿過另一個實體,因爲這個問題..但直到現在是更好的解決方案。 – anotherNeo

0

就使用實體框架生成商店表達式而言,包含(熱切加載)不適用於選擇(投影)。

你可以找到更多的信息If I select from an IQueryable then the Include is lost,你也可以在那裏看到一個工作。

我不知道是否列出的工作將在您的情況下工作,因爲您的投影具有多個回報(而不是預期的對象)。

既然你說,最終的圖形就是你除了執行實際計數想要的東西,爲什麼不把它變成:

var user = query.Where(c => c.UserID == clientId) 
    .Include(c => c.AssignedProjects) 
    .Include(c => c.IssuesReported) 
    .Single(); 

var userDetailsData = new UserDetailsData<Client>() 
{ 
    User = user, 
    IssuesCount = user.IssuesReported.Count(), 
}; 
+0

感謝您的回覆。是的,我首先想到了這個解決方案,但我真的很想要問題的數量,我不想爲了計算它們而將任何問題加載到內存中;) – anotherNeo