亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

ASP.NET Mvc開發之EF延遲加載

2024-07-10 13:29:54
字體:
來源:轉載
供稿:網友
ASP.NET Mvc開發之EF延遲加載,到底什么是EF的延遲加載呢?這篇文章我們就來看看
 

先來看看定義

EF延遲加載:就是使用Lamabda表達式或者Linq 從 EF實體對象中查詢數據時,EF并不是直接將數據查詢出來,而是在用到具體數據的時候才會加載到內存。

一、實體對象的Where方法返回一個什么對象?

大家來看一下上一篇文章的代碼來分析一下:

#region 查詢文章列表+ActionResult Article()    /// <summary>    /// 查詢文章列表    /// </summary>    /// <returns></returns>    public ActionResult Article()    {      //通過db對象獲取文章列表      db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達式來獲取為被刪除的文章            //使用Lamabda表達式來獲取數據      //返回一個List<T>的對象來存儲文章列表      List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList();                  //也可以使用Linq來獲取數據       List<Models.BlogArticle> list1 = (from p in db.BlogArticles where p.AIsDel == false select p).ToList();      //使用ViewData來傳遞list對象      ViewData["DataList"] = list;      return View();    }     #endregion

為了體驗延遲加載,我們把代碼做修改如下:

#region 查詢文章列表+ActionResult Article()    /// <summary>    /// 查詢文章列表    /// </summary>    /// <returns></returns>    public ActionResult Index()    {      //通過db對象獲取文章列表      db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達式來獲取為被刪除的文章      DbQuery<Models.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery<Models.BlogArticle>;      List<Models.BlogArticle> list = query.ToList();      //使用ViewData來傳遞list對象      ViewData["DataList"] = query;      return View();    }    #endregion

在這里我們為什么要使用DbQuery<T>來接收呢?

首先我們來看使用db.BlogArticles.Where()來獲取文章列表的時候,Where()方法給我們返回一個什么類型的對象呢?我們把鼠標放在Where()方法上后,會發現Where會返回給我們一個IQueryable的泛型接口對象,如下圖:

ASP.NET Mvc開發之EF延遲加載

那我們是不是需要使用IQueryable對象來接收獲取的對象呢,代碼如下:

//where()方法返回一個IQuery的接口 IQueryable < Models.BlogArticle > query= db.BlogArticles.Where(p => p.AIsDel == false);

這里的Query到底能不能取到值呢?我們來運行調試程序,結果如下:

ASP.NET Mvc開發之EF延遲加載

我們在局部變量窗口看到Query已經取到了值。但是根據面向對象的原則,接口是不能直接實例化的,但是這里的代碼又是不報錯的,那是為什么呢?

根據面向對象的里氏替換原則,我們都知道,這里實際上是返回了一個IQueryable對象的子類對象。

注意:C#里氏替換原則,子類對象可以賦值給父類對象。也就是說子類可以替換父類出現的地方。但是父類對象一定不可以替換子類對象。

也就是說Where()方法返回了一個IQueryable接口的子類對象,并且賦值給了它的父類對象IQueryable。

那么Where()到底返回了一個什么樣的對象呢(什么樣的IQueryable的子類對象呢)?

再次看上面的局變量窗口中query的返回值類型為,如下圖:

ASP.NET Mvc開發之EF延遲加載

我們可以很明顯的看出,query的返回類型為DbQuery類型。

那我們就用DbQuery來接收對象,代碼如下:

 

復制代碼代碼如下:
DbQuery<Models.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery<Models.BlogArticle

 

因為Where()方法返回的是IQueryable對象,所以要把對象轉換成DbQuery對象。

二、DbQuery<T>泛型接口類的延遲加載

上面的定義已經說過了EF延遲加載的定義,那么在這里我們在query查詢到對象時,數據庫有沒有執行查詢操作呢?

這里我們借助SqlServer的自身的Profiler軟件來查看,

①打開SqlServerProfiler軟件,新建一個查詢,剛開始,是有查詢記錄的,如下圖:

ASP.NET Mvc開發之EF延遲加載

②我們使用上圖中的,紅色箭頭指的橡皮,清除一下記錄,如下圖:

ASP.NET Mvc開發之EF延遲加載

③我們再次啟動調試,運行代碼,當程序運行到斷點的時候,我們看到query還沒有值,如下圖:

ASP.NET Mvc開發之EF延遲加載

④單步調試,進行下一步,我們在局部變量窗口中發現query已經取到了值,如下圖:

ASP.NET Mvc開發之EF延遲加載

query的值,如下圖:

ASP.NET Mvc開發之EF延遲加載

那么我們的SqlServerProfiler跟蹤器發生了什么變化呢?沒有發生任何變化,如下圖:

ASP.NET Mvc開發之EF延遲加載

我們如果使用ADO.NET操作數據庫,查詢完數據后,數據會立即送給接收的對象(比如:DataTable對象),但是EF操作數據庫怎么卻沒有立即去查詢數據呢?

⑤DbQuery對象的延遲加載

當我們使用query對象的時候才回去查詢數據庫,我們繼續執行下一步,結果如下:

ASP.NET Mvc開發之EF延遲加載

這個時候list取到了值,然后Sql Server Profiler也發生了變化,有了查詢數據庫的記錄,如下圖:

ASP.NET Mvc開發之EF延遲加載

也就是說,當query對象ToList()的時候,才發生了查詢數據庫的操作。

三、總結

1)EF中的DbQuery對象操作數據庫的時候發生延遲加載,而直接使用List<T>來接受對象時則不會;

2)延遲加載不會立即去查詢數據庫,而是在使用數據的時候才EF才會去查詢數據庫。

以上就是關于ASP.NET Mvc開發過程中EF延遲加載的相關介紹,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久网址| 国语对白做受69| 色噜噜狠狠色综合网图区| 8090理伦午夜在线电影| 色哟哟入口国产精品| 日韩在线视频观看正片免费网站| 成人免费看吃奶视频网站| 全亚洲最色的网站在线观看| 2019亚洲男人天堂| 亚洲国产日韩欧美在线图片| 美女视频黄免费的亚洲男人天堂| 国产精品一区久久久| 亚洲国产精久久久久久| 亚洲国产精品电影在线观看| 欧美一级片久久久久久久| 成人精品一区二区三区| 色妞色视频一区二区三区四区| 国内精品国产三级国产在线专| 国产精品一区二区久久久久| 久久久国产一区二区| 91成品人片a无限观看| 国产成人高清激情视频在线观看| 2024亚洲男人天堂| 日韩女在线观看| 日韩中文在线中文网三级| 日韩有码片在线观看| 免费不卡欧美自拍视频| 久久天天躁狠狠躁夜夜av| 国产精品永久免费| 成人在线一区二区| 欧美极品少妇xxxxx| 成人午夜激情免费视频| 国产精品九九久久久久久久| 亚洲男人天堂2023| 久久久精品日本| 色噜噜久久综合伊人一本| 国产a∨精品一区二区三区不卡| 7777kkkk成人观看| 国产不卡精品视男人的天堂| 久久久久久久电影一区| 久久久久久91香蕉国产| 日韩精品中文字幕久久臀| 日本欧美中文字幕| 一本大道香蕉久在线播放29| 欧美成人精品一区二区三区| 国产成人精品a视频一区www| 日韩精品极品视频免费观看| 日韩视频―中文字幕| 欧美性猛交xxxx乱大交| 91性高湖久久久久久久久_久久99| 国产一区二区三区丝袜| 日本成人精品在线| 成人黄色片在线| 日韩福利视频在线观看| 日韩激情av在线免费观看| 午夜美女久久久久爽久久| 亚洲综合精品伊人久久| 最近的2019中文字幕免费一页| 亚洲成人免费在线视频| 欧美wwwxxxx| 亚洲午夜未满十八勿入免费观看全集| 91香蕉嫩草影院入口| 精品伊人久久97| 亚洲人成在线电影| 欧美激情免费视频| 国产精品久久久久91| 午夜精品理论片| 欧美日本中文字幕| 久久久综合av| 欧美性在线视频| 伊人久久综合97精品| 日韩欧美国产网站| 一区三区二区视频| 国产精品一区二区久久久久| 欧美性xxxx极品高清hd直播| 播播国产欧美激情| 日韩av网站导航| 久久久久99精品久久久久| www国产精品视频| 亚洲欧美第一页| 九九热精品在线| 黑丝美女久久久| 久久精品色欧美aⅴ一区二区| 国产69久久精品成人| 不卡av电影在线观看| 欧美精品一二区| 日韩中文字幕不卡视频| 91国产精品视频在线| 欧美日韩不卡合集视频| 国产成人精品免高潮费视频| 久久久久久午夜| 久久人人爽人人爽人人片av高请| 最新国产成人av网站网址麻豆| 日韩精品电影网| 色婷婷**av毛片一区| 久久99久国产精品黄毛片入口| 国产精品a久久久久久| 亚洲天堂男人天堂| 欧美精品福利在线| 色悠久久久久综合先锋影音下载| 亚洲高清在线观看| 亚洲激情第一页| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品亚洲片夜色在线| 亚洲国产天堂久久国产91| 亚洲第一黄色网| 久久久久久久久久久久久久久久久久av| 日韩国产在线看| 免费91麻豆精品国产自产在线观看| 久久不射热爱视频精品| 久久精品一本久久99精品| 欧美性猛交99久久久久99按摩| 国产精品视频地址| 成人午夜高潮视频| 不卡中文字幕av| 欧美自拍大量在线观看| 成人在线视频福利| 欧美一区视频在线| 国产日韩欧美视频| 一本色道久久综合狠狠躁篇的优点| 国产精品福利在线| 久久久久中文字幕2018| 国产美女直播视频一区| 欧美日韩综合视频| 国产精品偷伦一区二区| 国产一区二区在线免费| 欧美精品久久久久久久久久| 亚洲精品丝袜日韩| 日本中文字幕不卡免费| 久久影院在线观看| 亚洲无av在线中文字幕| 欧美性少妇18aaaa视频| www.国产精品一二区| 亚洲国产黄色片| 久久成人精品视频| 久久精品国产亚洲| 日本欧美精品在线| 福利二区91精品bt7086| 国产欧美日韩中文字幕| 国产精品老牛影院在线观看| 欧美精品在线免费播放| 国产精品偷伦视频免费观看国产| 狠狠色噜噜狠狠狠狠97| 国产精品自产拍在线观看中文| 精品香蕉在线观看视频一| 亚洲欧美精品一区| 性欧美长视频免费观看不卡| 久久婷婷国产麻豆91天堂| 亚洲无av在线中文字幕| 九九精品在线观看| 久久久久久国产精品美女| 欧美成人午夜激情| 亚洲性生活视频在线观看| 欧美日韩在线一区| 欧美午夜激情在线| 欧美疯狂xxxx大交乱88av| 国产主播精品在线| 久久精品视频免费播放| 日韩精品免费电影| 国产精品高潮呻吟久久av野狼| 国产精品夫妻激情| 57pao成人国产永久免费| 这里只有精品久久| 日韩在线观看网站|