欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ASP.NETMvc中怎么實(shí)現(xiàn)EF延遲加載-創(chuàng)新互聯(lián)

這篇文章給大家介紹ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)是專業(yè)的靜安網(wǎng)站建設(shè)公司,靜安接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行靜安網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

一、實(shí)體對象的Where方法返回一個(gè)什么對象?

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


#region 查詢文章列表+ActionResult Article()
    /// <summary>
    /// 查詢文章列表
    /// </summary>
    /// <returns></returns>
    public ActionResult Article()
    {
      //通過db對象獲取文章列表
      db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達(dá)式來獲取為被刪除的文章
      
      //使用Lamabda表達(dá)式來獲取數(shù)據(jù)
      //返回一個(gè)List<T>的對象來存儲(chǔ)文章列表
      List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList();
      
      
      //也可以使用Linq來獲取數(shù)據(jù) 
      List<Models.BlogArticle> list1 = (from p in db.BlogArticles where p.AIsDel == false select p).ToList();

      //使用ViewData來傳遞list對象
      ViewData["DataList"] = list;

      return View();
    } 
    #endregion

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


#region 查詢文章列表+ActionResult Article()
    /// <summary>
    /// 查詢文章列表
    /// </summary>
    /// <returns></returns>
    public ActionResult Index()
    {
      //通過db對象獲取文章列表
      db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達(dá)式來獲取為被刪除的文章

      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

在這里我們?yōu)槭裁匆褂肈bQuery<T>來接收呢?

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

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

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

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

這里的Query到底能不能取到值呢?我們來運(yùn)行調(diào)試程序,結(jié)果如下:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

我們在局部變量窗口看到Query已經(jīng)取到了值。但是根據(jù)面向?qū)ο蟮脑瓌t,接口是不能直接實(shí)例化的,但是這里的代碼又是不報(bào)錯(cuò)的,那是為什么呢?

根據(jù)面向?qū)ο蟮睦锸咸鎿Q原則,我們都知道,這里實(shí)際上是返回了一個(gè)IQueryable對象的子類對象。

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

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

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

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

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

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

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

復(fù)制代碼 代碼如下:

DbQuery<Models.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery<Models.BlogArticle

因?yàn)閃here()方法返回的是IQueryable對象,所以要把對象轉(zhuǎn)換成DbQuery對象。

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

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

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

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

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

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

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

③我們再次啟動(dòng)調(diào)試,運(yùn)行代碼,當(dāng)程序運(yùn)行到斷點(diǎn)的時(shí)候,我們看到query還沒有值,如下圖:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

④單步調(diào)試,進(jìn)行下一步,我們在局部變量窗口中發(fā)現(xiàn)query已經(jīng)取到了值,如下圖:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

query的值,如下圖:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

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

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

我們?nèi)绻褂肁DO.NET操作數(shù)據(jù)庫,查詢完數(shù)據(jù)后,數(shù)據(jù)會(huì)立即送給接收的對象(比如:DataTable對象),但是EF操作數(shù)據(jù)庫怎么卻沒有立即去查詢數(shù)據(jù)呢?

⑤DbQuery對象的延遲加載

當(dāng)我們使用query對象的時(shí)候才回去查詢數(shù)據(jù)庫,我們繼續(xù)執(zhí)行下一步,結(jié)果如下:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

這個(gè)時(shí)候list取到了值,然后Sql Server Profiler也發(fā)生了變化,有了查詢數(shù)據(jù)庫的記錄,如下圖:

ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載

也就是說,當(dāng)query對象ToList()的時(shí)候,才發(fā)生了查詢數(shù)據(jù)庫的操作。

三、總結(jié)

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

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

關(guān)于ASP.NET Mvc中怎么實(shí)現(xiàn)EF延遲加載就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁題目:ASP.NETMvc中怎么實(shí)現(xiàn)EF延遲加載-創(chuàng)新互聯(lián)
分享路徑:http://aaarwkj.com/article28/ccohcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站導(dǎo)航、網(wǎng)站營銷、品牌網(wǎng)站制作微信公眾號(hào)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
和富婆啪啪一区二区免费看| 美女丝袜诱惑国产91| av影片免费网址大全| 日韩精品熟妻人女亚洲一区| 日韩精品在线不卡一区| 香蕉伊蕉伊中文在线视频| 国产精品一区二区av麻豆| 蜜臀av网站在线播放| 亚洲区一区二区三区亚洲| 久久精品国产亚洲av不卡| 美女一区二区三区日本美女在线观看 | 国产胖中年妇女草逼网站| 六十路人妻一区二区三区| 亚洲无人区码一码二码三码| 国产美女主播视频一区二区三区| 亚洲熟女av综合网丁香| 一区二区三区视频观看在线| 2018在线不卡爱视频| 欧美亚洲午夜精品久久久| 国产成人综合久久三区北岛玲| 美女视频一区二区三区在线观看| 亚洲国产成在人网站天堂| 亚洲男人成人性天堂网站| 婷婷激情综合亚洲五月色| 91欧美精品午夜性色福利| 亚洲综合欧美自偷自拍| 亚洲中文字幕精品一区二区三区| 中文字幕在线一级色视频| 蜜桃精品人妻一区二区三区| 午夜福利中文在线观看| 色哟哟亚洲精品一区二区| 欧美高清成人一区二区三区| 精品人妻中文字幕在线| 国产aaa级日本一区二区三区| 亚洲一二三无人区是什么| 免费观看毛片一区二区三区| 九九视频在线观看免费专区 | 午夜福利网午夜福利网| 国产精品亚洲伦理在线| 亚洲精品伦理中文字幕| 内地精品露脸自拍视频|