2011-04-15 31 views
3

我瞭解延遲加載,立即加載與.INCLUDE與.load()顯式加載,但一些混淆我是當你在查詢項目,並明確要求導航屬性這樣的:在實體框架中是否表現出懶惰,渴望或明確?

var address = from a in context.Addresses 
       select {a, Name = a.Contact.Name} 

此處聯繫人是鏈接到聯繫人實體的地址中的導航屬性。

我嘗試了兩種延遲加載和關閉,它可以同時工作。我想知道我什麼時候要求我的數據,我渴望加載或延期加載?我的理解是,只有一個查詢將被提交給數據庫,這意味着它正在加載,除非在這種情況下,只有Contact實體的「Name」屬性纔會被加載,而不是整個聯繫實體(如果我要使用上下文)。 Addresses.include( 「聯繫方式」)?它是否使這樣的查詢比使用.include()進行熱切加載更高效?

一些澄清將不勝感激。

回答

2

延遲加載,急切加載和顯式加載在最常見的情況下起作用。投影替代了急切的加載,因爲它也可以通過單個查詢加載相關實體。如果您需要使用一些複雜的查詢加載實體,則使用投影是有意義的,因爲在這種情況下,預加載不起作用。如果需要,請使用投影:

  • linq查詢中的任何類型的連接或聚合。據我所知,Include一旦開始使用手動連接就會被忽略。
  • 任何一種過濾或排序的導航屬性。 Include只能加載導航屬性中的所有相關實體,而不進行任何排序。一旦您需要在相關實體上應用條件或訂單時,您不能使用Include,並且您必須使用投影。
1

這是懶惰的評估,因爲它不會執行,直到地址列舉爲止。

預加載通常用於描述預加載的實體對象的導航屬性,但在這種情況下,在投射到匿名類型時,您並不直接實現任何實體對象。

如果您訪問a.Contact.Name而不是Name,您很可能會導致另一個數據庫命中,因爲您尚未加載Address的Contact對象,因此您專門選擇並將Name屬性投影到匿名對象上。