天天看點

EF 延遲加載技術

一、EF延遲加載介紹

其實延遲加載的本質就是用的時候去加載

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);
            }
           
EF 延遲加載技術
EF 延遲加載技術

建立了查詢Linq查詢對象但是EF并沒有去查詢資料庫

EF 延遲加載技術
EF 延遲加載技術

在真正使用資料的時候EF才會去資料庫查詢資料

二、EF的第二種延遲加載

EF 延遲加載技術
EF 延遲加載技術
EF 延遲加載技術
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("查詢結束");
           
EF 延遲加載技術
EF 延遲加載技術
EF 延遲加載技術
EF 延遲加載技術

五、使用建議

隻有在目前導航屬性的内容每次都需要加載的時候就,采用Include("[導航屬性]")來一次性加載過來,減少查詢次數

繼續閱讀