通過昨天對EF貪婪加載和延遲加載的學習,不難發現,延遲加載還是很好用的,但是問題也就來了,有的時候我們只需要加載一個實體,不需要和他相關的外部實體,這時候我們來看看EF延遲加載時怎么作用的吧
打開profiler
在Main函數入口處寫一個查詢,在Console.Read();處打一個斷點
static void Main(string[] args)
{
var context = new EFDbContext();
var user = context.Users.FirstOrDefault(a => a.Id == 1);
Console.WriteLine(user.Name);
Console.Read();
}
在profiler中最后一行可以看他EF生成sql語句

也就是說我們只需要實體本身的屬性的時候EF不會幫我們加載外部實體
接下來修改一下Main函數中的內容
static void Main(string[] args)
{
var context = new EFDbContext();
var users = context.Users.FirstOrDefault(a => a.Id == 1);
//var users = context.Users.Include("Articles").FirstOrDefault(a => a.Id == 1);
Console.WriteLine(users.Name);
foreach (var a in users.Articles)
{
Console.WriteLine(a.Title + "," + a.Category.Name + "\n");
}
Console.WriteLine(users.Articles.Count() + "\n" + users.Categories.Count() + "\n");
Console.Read();
}
進行單步調試並觀察profiler發現,延遲加載是在我們需要某一個外部實體時才從數據庫中查找的

換成貪懶加載

結論;
延遲加載是在我們需要的時候才去加載,當需要加載大量的外鍵對象時會增加與數據庫的讀取次數
此時可以考慮貪婪加載
