濮阳杆衣贸易有限公司

主頁 > 知識庫 > ASP.NET Mvc開發(fā)之EF延遲加載

ASP.NET Mvc開發(fā)之EF延遲加載

熱門標(biāo)簽:濮陽外呼電銷系統(tǒng)怎么樣 塔城代理外呼系統(tǒng) 地圖標(biāo)注專業(yè)團隊 地圖定位圖標(biāo)標(biāo)注 地圖標(biāo)注的公司有哪些 天心智能電銷機器人 400電話辦理哪家性價比高 遂寧市地圖標(biāo)注app 代理接電話機器人如何取消

先來看看定義

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

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

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

#region 查詢文章列表+ActionResult Article()
    /// summary>
    /// 查詢文章列表
    /// /summary>
    /// returns>/returns>
    public ActionResult Article()
    {
      //通過db對象獲取文章列表
      db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表達式來獲取為被刪除的文章
      
      //使用Lamabda表達式來獲取數(shù)據(jù)
      //返回一個ListT>的對象來存儲文章列表
      List  Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList();
      
      
      //也可以使用Linq來獲取數(shù)據(jù) 
      ListModels.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表達式來獲取為被刪除的文章

      DbQueryModels.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQueryModels.BlogArticle>;

      ListModels.BlogArticle> list = query.ToList();
      //使用ViewData來傳遞list對象
      ViewData["DataList"] = query;

      return View();
    }
    #endregion

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

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

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

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

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

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

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:
DbQueryModels.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQueryModels.BlogArticle

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

二、DbQueryT>泛型接口類的延遲加載

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

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

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

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

③我們再次啟動調(diào)試,運行代碼,當(dāng)程序運行到斷點的時候,我們看到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對象的延遲加載

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

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

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

三、總結(jié)

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

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

以上就是關(guān)于ASP.NET Mvc開發(fā)過程中EF延遲加載的相關(guān)介紹,希望對大家的學(xué)習(xí)有所幫助。

您可能感興趣的文章:
  • 解決asp.net mvc UpdateModel更新對象后出現(xiàn)null問題的方法
  • ASP.NET MVC命名空間時引起錯誤的解決方法
  • ASP.NET MVC實現(xiàn)儀表程序
  • ASP.NET Mvc開發(fā)之查詢數(shù)據(jù)
  • ASP.NET Mvc開發(fā)之刪除修改數(shù)據(jù)
  • ASP.NET MVC中HtmlHelper控件7個大類中各個控件使用詳解
  • 詳解ASP.NET MVC Form表單驗證
  • ASP.NET MVC4 HtmlHelper擴展類,實現(xiàn)分頁功能
  • asp.net MVC利用自定義ModelBinder過濾關(guān)鍵字的方法(附demo源碼下載)
  • ASP.NET MVC使用ActionFilterAttribute實現(xiàn)權(quán)限限制的方法(附demo源碼下載)
  • ASP.NET MVC @Helper輔助方法和@functons自定義函數(shù)的使用方法

標(biāo)簽:麗江 宜春 汕頭 河南 婁底 重慶 吉林 本溪

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET Mvc開發(fā)之EF延遲加載》,本文關(guān)鍵詞  ASP.NET,Mvc,開,發(fā)之,延遲,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ASP.NET Mvc開發(fā)之EF延遲加載》相關(guān)的同類信息!
  • 本頁收集關(guān)于ASP.NET Mvc開發(fā)之EF延遲加載的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    鸡泽县| 乳山市| 如东县| 商河县| 临武县| 龙川县| 洛扎县| 遵义县| 通城县| 固始县| 台中市| 德昌县| 泌阳县| 乌拉特中旗| 郯城县| 黎平县| 石狮市| 博客| 夏邑县| 日喀则市| 遂川县| 沾益县| 平罗县| 红河县| 银川市| 玛多县| 微博| 无极县| 侯马市| 忻州市| 子洲县| 留坝县| 天等县| 海阳市| 珲春市| 温州市| 保亭| 建湖县| 光山县| 盐边县| 大厂|