Entity Framework加载相关实体——Explicit Loading
上一回我們?cè)凇禘ntity Framework加載相關(guān)實(shí)體——Lazy Loading》分析了Lazy Loading,這一回我們來(lái)分析一下在關(guān)閉Lazy Loading的情況下,如果顯式加載實(shí)體。
數(shù)據(jù)庫(kù)我們依舊使用Lazy Loading中使用的數(shù)據(jù)庫(kù)。之前我們分析過(guò)來(lái),當(dāng)Lazy Loading關(guān)閉時(shí),執(zhí)行以下代碼是無(wú)法得到結(jié)果的,因?yàn)镻layer的信息并沒(méi)有被加載。
View Code 1 using (TestEntities context = new TestEntities()) 2 { 3 IQueryable<Team> teams = from t in context.Teams select t; 4 foreach (Team t in teams) 5 { 6 Console.WriteLine(t.Players.Count()); 7 } 8 Console.Read(); 9 }如果我們想要得到t.Players.Count()的結(jié)果,我們可以顯式地加載Player信息:
View Code 1 using (TestEntities context = new TestEntities()) 2 { 3 IQueryable<Team> teams = from t in context.Teams select t; 4 foreach (Team t in teams) 5 { 6 //explicitly loading players 7 t.Players.Load(); 8 Console.WriteLine(t.Players.Count()); 9 } 10 Console.Read(); 11 }當(dāng)t.Players.Load()執(zhí)行時(shí),Object Service會(huì)向數(shù)據(jù)庫(kù)發(fā)出請(qǐng)求返回該team的所有player信息。
我們也可以從many端加載與它相對(duì)應(yīng)的one端,在這個(gè)例子中也就是從Player加載與該player相對(duì)應(yīng)的team信息。這里需要用到TeamReference:
View Code 1 using (TestEntities context = new TestEntities()) 2 { 3 IQueryable<Player> players = from p in context.Players select p; 4 foreach (Player p in players) 5 { 6 if (p.Age > 30) 7 { 8 p.TeamReference.Load(); 9 Console.WriteLine(p.PlayerName + " -> " + p.Team.TeamName); 10 } 11 } 12 Console.Read(); 13 }執(zhí)行結(jié)果如下:
當(dāng)我們打出p.后會(huì)發(fā)現(xiàn),智能提示中出現(xiàn)了Team和TeamReference,這里我們選擇TeamReference,因?yàn)镋F將p.Team認(rèn)為就是一個(gè)Team實(shí)體。
無(wú)論使用Lazy Loading還是將Load方法放入foreach循環(huán)語(yǔ)句,都會(huì)導(dǎo)致程序頻繁訪問(wèn)數(shù)據(jù)庫(kù),導(dǎo)致程序性能下降。我們可以選擇性地加載需要的實(shí)體,例如上面代碼,我們只加載年齡超過(guò)30歲的球員所在球隊(duì)的信息。
至此,Lazy Loading和Explicit Loading都已經(jīng)分析完了,下一次我們來(lái)分析加載相關(guān)實(shí)體的最后一種形式Eager Loading.
?
轉(zhuǎn)載于:https://www.cnblogs.com/simonwonn/archive/2012/11/27/2790220.html
總結(jié)
以上是生活随笔為你收集整理的Entity Framework加载相关实体——Explicit Loading的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在VS2010中F5调试Silverli
- 下一篇: vb.net利用SerialPort进行