2016-07-25 17 views
0

我將圖像存儲在SQL Server中的bytes[]中,然後使用VIEWDATA檢索它(如下所示)(數據庫中有9個圖像(bytes[])這我檢索):從ASP.NET MVC中的SQL Server獲取極慢的檢索圖像(以字節[]存儲)5

動作控制器:

public ActionResult show_pics2() 
{ 
    using (cygnussolutionEntities6 db = new cygnussolutionEntities6()) 
    { 
     // db.CommandTimeout = int.MaxValue; //For test 
     var querylist = (from f in db.Images 
         select f.ImageContent); 

     // get list in ViewBag 
     ViewBag.DataLIst = querylist; 

     // get list in View Data 
     ViewData["images"] = querylist.ToList(); 

     return View(); 
    } 
} 

考慮,我解析圖像,並與foreach循環和viewDATA顯示出來,但是要花這麼長時間來加載到瀏覽器。有誰知道爲什麼這麼長時間?

+0

爲什麼要在ViewBag和ViewData中存儲相同的對象'querrylist'? – mmushtaq

+0

多數民衆贊成什麼我只是評論viewBag –

+0

'db.Images'有多少圖像,他們有多大? – Enigmativity

回答

0

在代碼中加入一些定時器以查看緩慢發生的位置是值得的 - 也就是說,對數據庫的查詢速度慢,正在將結果實現爲緩慢列表,還是將緩慢發生在處理圖像時查看。

還值得考慮 - 您是否急於加載Images表中的任何屬性,因爲這會影響性能,具體取決於正在加載的額外導航屬性的數量。

您是否能夠在您的視圖和實體類中發佈代碼?

0
  1. 如果你要ToList()東西,也將在其他地方使用它,然後做兩個用途使用ToList()的結果(除非你真的需要維護可查詢的接口)。那麼你只需要一次獲取該列表。

  2. 沒有獲得幾個斑點,並利用它們的網頁上,獲得幾個ID和使用它們通過<img src="theImage/@id">或類似的調用其他資源,然後有一個資源通過只檢索唯一的圖像的視圖提供服務。然後,每個這樣的資源加載單個圖像,並且可以彼此並行地進行。

  3. 除非圖像都很小,否則使用基於ADO訪問blob的流並一次流出4096個字節塊,而不是EF。雖然這意味着留下很多EF給你的東西(還有很多MVC給你的東西,因爲你必須在結果而不是視圖中做),它允許內存有效的流式傳輸,可以從第一次加載塊。

+0

謝謝我正在努力:) –