這篇文章給大家介紹ASP.NET Mvc中怎么實現(xiàn)EF延遲加載,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)是專業(yè)的靜安網(wǎng)站建設公司,靜安接單;提供成都網(wǎng)站設計、網(wǎng)站制作,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行靜安網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!一、實體對象的Where方法返回一個什么對象?
大家來看一下上一篇文章的代碼來分析一下:
#region 查詢文章列表+ActionResult Article() ////// 查詢文章列表 /// ///public ActionResult Article() { //通過db對象獲取文章列表 db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達式來獲取為被刪除的文章 //使用Lamabda表達式來獲取數(shù)據(jù) //返回一個List 的對象來存儲文章列表 List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList(); //也可以使用Linq來獲取數(shù)據(jù) List list1 = (from p in db.BlogArticles where p.AIsDel == false select p).ToList(); //使用ViewData來傳遞list對象 ViewData["DataList"] = list; return View(); } #endregion
為了體驗延遲加載,我們把代碼做修改如下:
#region 查詢文章列表+ActionResult Article() ////// 查詢文章列表 /// ///public ActionResult Index() { //通過db對象獲取文章列表 db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達式來獲取為被刪除的文章 DbQuery query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery ; List list = query.ToList(); //使用ViewData來傳遞list對象 ViewData["DataList"] = query; return View(); } #endregion
在這里我們?yōu)槭裁匆褂肈bQuery
首先我們來看使用db.BlogArticles.Where()來獲取文章列表的時候,Where()方法給我們返回一個什么類型的對象呢?我們把鼠標放在Where()方法上后,會發(fā)現(xiàn)Where會返回給我們一個IQueryable的泛型接口對象,如下圖:
那我們是不是需要使用IQueryable對象來接收獲取的對象呢,代碼如下:
//where()方法返回一個IQuery的接口 IQueryable < Models.BlogArticle > query= db.BlogArticles.Where(p => p.AIsDel == false);
這里的Query到底能不能取到值呢?我們來運行調(diào)試程序,結果如下:
我們在局部變量窗口看到Query已經(jīng)取到了值。但是根據(jù)面向對象的原則,接口是不能直接實例化的,但是這里的代碼又是不報錯的,那是為什么呢?
根據(jù)面向對象的里氏替換原則,我們都知道,這里實際上是返回了一個IQueryable對象的子類對象。
注意:C#里氏替換原則,子類對象可以賦值給父類對象。也就是說子類可以替換父類出現(xiàn)的地方。但是父類對象一定不可以替換子類對象。
也就是說Where()方法返回了一個IQueryable接口的子類對象,并且賦值給了它的父類對象IQueryable。
那么Where()到底返回了一個什么樣的對象呢(什么樣的IQueryable的子類對象呢)?
再次看上面的局變量窗口中query的返回值類型為,如下圖:
我們可以很明顯的看出,query的返回類型為DbQuery類型。
那我們就用DbQuery來接收對象,代碼如下:
復制代碼 代碼如下:
DbQuery 因為Where()方法返回的是IQueryable對象,所以要把對象轉換成DbQuery對象。 二、DbQuery 上面的定義已經(jīng)說過了EF延遲加載的定義,那么在這里我們在query查詢到對象時,數(shù)據(jù)庫有沒有執(zhí)行查詢操作呢? 這里我們借助SqlServer的自身的Profiler軟件來查看, ①打開SqlServerProfiler軟件,新建一個查詢,剛開始,是有查詢記錄的,如下圖: ②我們使用上圖中的,紅色箭頭指的橡皮,清除一下記錄,如下圖: ③我們再次啟動調(diào)試,運行代碼,當程序運行到斷點的時候,我們看到query還沒有值,如下圖: ④單步調(diào)試,進行下一步,我們在局部變量窗口中發(fā)現(xiàn)query已經(jīng)取到了值,如下圖: query的值,如下圖: 那么我們的SqlServerProfiler跟蹤器發(fā)生了什么變化呢?沒有發(fā)生任何變化,如下圖: 我們?nèi)绻褂肁DO.NET操作數(shù)據(jù)庫,查詢完數(shù)據(jù)后,數(shù)據(jù)會立即送給接收的對象(比如:DataTable對象),但是EF操作數(shù)據(jù)庫怎么卻沒有立即去查詢數(shù)據(jù)呢? ⑤DbQuery對象的延遲加載 當我們使用query對象的時候才回去查詢數(shù)據(jù)庫,我們繼續(xù)執(zhí)行下一步,結果如下: 這個時候list取到了值,然后Sql Server Profiler也發(fā)生了變化,有了查詢數(shù)據(jù)庫的記錄,如下圖: 也就是說,當query對象ToList()的時候,才發(fā)生了查詢數(shù)據(jù)庫的操作。 三、總結 1)EF中的DbQuery對象操作數(shù)據(jù)庫的時候發(fā)生延遲加載,而直接使用List 2)延遲加載不會立即去查詢數(shù)據(jù)庫,而是在使用數(shù)據(jù)的時候才EF才會去查詢數(shù)據(jù)庫。 關于ASP.NET Mvc中怎么實現(xiàn)EF延遲加載就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
文章題目:ASP.NETMvc中怎么實現(xiàn)EF延遲加載-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://weahome.cn/article/ccohcp.html