2010-07-12 253 views

回答

7

延遲加載和延遲是非常同義的(AFAIK,請糾正我,如果我錯了)。 Eager和Lazy之間最大的區別在於。急於將前面發生的「按需」和執行將在DB發生LEVEL-讓我們來簡單,懶只會發生JOIN語句作爲一個例子

var people = (from p in people SELECT p).ToList(); 
var jobs = (from j in jobs SELECT j).ToList(); 

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList() 

這是預先加載的一個例子。我們得到了所有的人,所有的工作,我們正在加入記憶。不是很聰明(通常)。這是它看起來像懶惰式的。

var people = (from p in people SELECT p); 
var jobs = (from j in jobs SELECT j); 

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList() 

這是什麼做的是對人類和創造就業機會爲IQueryable(IQueryable的是懶惰),和連接是發生在DB。這節省了網絡活動,而且通常實際上更快,因爲數據庫已經過優化以進行連接等。

除非我們明確地說「我需要這些數據!」 (通過ToListing,遍歷它等等)它很懶。還有一些怪癖,但這應該是一個體面的底漆。

+0

注意 - 語法可能不是100%,只是脫離袖口。 – 2010-07-12 17:14:22

+0

根據你的例子,一旦做了一個ToList,它就會急切地加載,因爲它會觸發數據庫來獲取數據。所以,它似乎更像是一種編程風格。但是,對於EF,可以在「上下文選項」中將LazyLoading設置爲true或false。這怎麼適合? – DotnetDude 2010-07-12 18:31:18

+0

帶有LazyLoading關閉的EF4將要求您說People.Include(「Jobs」)以帶回作業記錄(假設作業是FK'd給People)。使用LazyLoading時,該數據將在需要時返回。 I.E.當你說People.Jobs.ToList(); – 2010-07-12 18:50:12

3

懶惰/延期加載:延遲加載和延遲加載是同一件事。該關係在第一次被訪問時被加載。這個想法是,如果數據不是必需的,它不應該被加載。

渴望加載:關係與Parent對象一起被提取。這可以在加載數據時更高效,但會加載數據,而不管數據是否被使用/未使用。

0

當查詢返回對象時,相關對象不會同時加載。

而是在導航屬性被訪問時自動加載。也稱爲「延遲加載」,