一、EF延遲加載介紹
其實延遲加載的本質就是用的時候去加載
//EF
var ef = new DataModelContainer();
//Linq查詢語句
var users = from info in ef.UserInfo
where info.ID > 4
select info;
Console.WriteLine("建立查詢語句完成");
//周遊列印資料
foreach (var userInfo in users)
{
Console.WriteLine("Id={0},Name={1}", userInfo.ID, userInfo.Name);
}
建立了查詢Linq查詢對象但是EF并沒有去查詢資料庫
在真正使用資料的時候EF才會去資料庫查詢資料
二、EF的第二種延遲加載
在未使用目前使用者對象的導航屬性的時候,EF是不會查詢導航屬性的
EF查詢導航屬性的時候,隻要記憶體裡面沒有那每次都會單獨去查詢一下資料庫,例如UserInfo表篩選出10條記錄,按照上面的代碼來執行,就會去查詢一次UserInfo表,十次SalesOrder表
三、延遲加載優點
延遲加載的優點是使用的時候才會去加載,特别是去查詢導航屬性的時候,這樣EF隻需要去查詢使用的内容,避免了查詢出多餘的資料
四、延遲加載缺點
像上面的語句,那就會查詢多次SalesOrder表,增加資料庫的壓力,
//EF
var ef = new DataModelContainer();
//Linq查詢語句,使用Include("[導航屬性]")直接一次加載指定導航屬性内容
var users = from info in ef.UserInfo.Include("SalesOrder")
where info.ID > 4
select info;
Console.WriteLine("建立查詢語句完成");
//周遊列印資料
foreach (var userInfo in users)
{
Console.WriteLine("Id={0},Name={1}", userInfo.ID, userInfo.Name);
foreach (var salesOrder in userInfo.SalesOrder)
{
Console.WriteLine("Id={0},Code={1}", salesOrder.ID, salesOrder.Code);
}
}
Console.WriteLine("查詢結束");
五、使用建議
隻有在目前導航屬性的内容每次都需要加載的時候就,采用Include("[導航屬性]")來一次性加載過來,減少查詢次數