2016-06-07 127 views
2

我需要僅加載列表中的5個元素而不加載所有列表。我有這兩個實體:在實體框架中從數據庫加載N條記錄

public class Company 
{ 
    public int ID { get; set; } 
    public String Name{ get; set; } 
    public List<Employee> EmployeeList{ get; set; }  
} 

和:

public class Employee 
{ 
    public int ID { get; set; } 
    public String Name{ get; set; }  
} 

我需要加載只有最後5個記錄的員工名爲「公司名稱」的公司。

我試着使用:

Company companySearch =systemDB.Companies 
           .Include("EmployeeList").Take(5) 
           .Where(d => d.Name.Equals("CompanyName")) 
           .SingleOrDefault(); 

但這代碼加載所有的列表,並給了我回來後只剩下最後5個記錄。我需要更快的查詢。

PS:這是代碼首先EF

+0

你檢查哪些查詢越來越由實體框架,通過SQL查詢分析器工具被炒到數據庫的更多的想法? – RBT

+1

預先加載返回所有數據 - 您必須在您的lambda表達式中使用預測 – tmg

+0

'd'變量'd => d.Name.Equals(「CompanyName」)'對應於公司類。公司類甚至沒有'Name'屬性。 – RBT

回答

2

對於加載的EmployeeList選擇N個記錄,你必須有一些基於標準的相集中導航屬性的成員將被過濾。我已將該標準作爲實體的值的ID屬性。以下是這將做EmployeeList集合的延遲加載Company實體的代碼片段沿所需的所有步驟

  1. 啓用你繼承的DbContext類的構造函數延遲加載。我相信systemDB是從DbContext

    public SystemDB() 
    { 
        this.Configuration.LazyLoadingEnabled = true; 
    } 
    
  2. 繼承的類的對象中刪除包括條款,以避免預先加載:

    Company companySearch =systemDB.Companies .Where(d => d.Name.Equals("CompanyName")) .SingleOrDefault();

這行代碼執行後,如果你檢查EmployeeList財產companySearch對象它會顯示爲Null在快速觀察窗口。

  1. 使用下面提到的調用執行延遲加載EmployeeList屬性。放置過濾記錄的明確標準。我已經設置了過濾標準來限制ID在1和5之間的僱員,這兩個邊界都是包容性的。

    db.Entry<Company>(companySearch).Collection(s => s.EmployeeList).Query().Where(p => p.ID >= 1 && p.ID <= 5).Load();

1

請注意,這是目前不可能過濾相關實體被載入其中。包含將始終引入所有相關實體。 Reference

你仍然可以嘗試匿名投影而無需惰性加載

this.Configuration.LazyLoadingEnabled = false; 

匿名投影。

Company companySearch =systemDB.Companies 
          .Where(d => d.Name.Equals("CompanyName")) 
          .Select(x=> new 
          { 
           company = x, 
           employees = x.Employees.Take(5), 
          } 
          .FirstOrDefault() 

你會得到關於如何做匿名投影here

相關問題