2014-03-07 17 views
7

首先,我使用Code First方法使用EF 6.0。 我的上下文配置設置爲啓用「代理創建」和「延遲加載」。實體框架 - 延遲加載即使使用ToList()

我的問題是: 延遲加載是否應該返回IEnumerable(而不是IQueryable)方法的結果?

我認爲下面的代碼是更強的解釋:

public void Test() 
{ 
    var company = GetCompanies().FirstOrDefault(); 

    if (company.Employees.Count() > 0) 
    { 
     //I got here without errors! 
    } 
} 

public IEnumerable<Company> GetCompanies() 
{ 
    var company = context.Companies.ToList(); 
    //Note that I did not Include the Employee (child table) 

    return company;    
} 

需要注意的是評論說,我說:「我來到這裏沒有錯誤!」。這意味着即使在ToList()調用之後,延遲加載也可以工作。我認爲在將IQueryable轉換爲List或IEnumerable之後,EF將失去執行延遲加載的能力。

我已經注意到代理仍然爲GetCompanies方法返回的實體啓用了(在debbug模式下,我可以看到醜陋的哈希像:System.Data.Entity.DynamicProxies.Company_7035BEA374959AC1 ...)。

延遲加載甚至可以在不同的DLL上調用它。它是否正確?我的意思是,即使我的方法返回一個IEnumerable(而不是IQueriable),一個不同的DLL可以在我的數據庫中進行後續調用嗎?

任何澄清將不勝感激。

回答

3

請注意,我說:「我到這裏沒有錯誤!」的評論。這意味着 即使在ToList()調用之後,延遲加載仍在工作。

這就是延遲加載的整點:你可以從數據庫中需要時,他們得到的實體(即當您訪問的屬性),而不是隻有當你執行查詢的第一次(即你的致電.ToList())。

延遲加載甚至可以在不同的DLL上調用它。這是 是否正確?我的意思是,即使我的方法返回一個IEnumerable(而不是IQueriable),一個不同的DLL是否可以在我的 數據庫中進行後續調用?

是的,這是正確的,但要小心,如果你處理你的上下文,延遲加載將不起作用(它會拋出ObjectDisposedException)。 此外,儘管您的代碼可以正常工作,但由於生成的SQL請求的數量可能會有性能問題。

附註:親自推薦不是使用lazy-loading。見https://stackoverflow.com/a/21379510/870604