2011-02-22 92 views
1

我有一個從我的實體模型中檢索項目的列表中ASP.net MVC控制器動作。對於這個實體,有一些屬性不在實體本身中。我創建了一個部分類以添加這些屬性:實體框架 - 拉回相關數據

public partial class Person 
{ 
    public int Extra 
    { 
     get 
     { 
      using(var ctx = new DBEntities()) 
      { 
       return ctx.OtherTable.Count(p => p.PersonID == this.PersonID); 
      } 
     } 
    } 
} 

正如您所看到的,我需要訪問的屬性來自另一個表。在我的MVC頁面中...我需要返回大量人員(每頁100+)。爲了顯示這個額外的字段,每個Person實體將分別打到數據庫......這非常低效。我有一個查詢返回所有人,然後爲每個人查詢每個屬性,我有這樣的。這最終可能是300次調用數據庫,這需要很長時間才能執行。

什麼是更好的方法來做到這一點?我會非常想執行一個查詢,返回所有的人民和額外的數據,但我也想額外的數據是個人實體的一部分,哪怕是在數據庫中一個單獨的表。

更新
從評論中添加更多的上下文。

我從存儲庫類中返回人員。我在另一個問題中被告知,知識庫應該只是處理實體本身。因此,檢索人員的代碼如下所示:

class PersonRepository 
{ 
    public IQueryable<Person> GetPeople() { 
     return from p in db.People 
       where p ... 
       select p; 
    } 
} 

我真的沒有在該情況下加入的選項。

回答

1

你可以做聯接:

var result = 
    from p in ctx.Persons 
    from a in ctx.OtherTable 
    where p.PersonID == personID 
    select new SomeViewModel 
    { 
     Name = p.Person.Name, 
     OtherTableValue = a.OtherValue 
    }; 
+0

檢索人是在資源庫中的代碼。在另一個問題中,我問是否應該返回視圖模型的存儲庫。我被告知他們應該只是返回你的實體。 – Dismissile 2011-02-22 19:38:04

1

我不確定您的數據庫設計是如何完成的。但爲什麼你不能加入來自兩個相關表格的數據,而只是一次而非多次地點擊數據? 即使那是你慢,你也可以緩存這些數據,並能夠在會話的生命週期內對其進行訪問。