2012-04-02 80 views
1

我正在建立一個電影網站。我正在使用mvc3和實體框架。我主要使用LINQ to Entities查詢數據庫。該網站的圖形用戶界面基本上是一個視圖頁面,除了第一次加載,我主要使用Ajax來根據搜索條件等來刷新電影列表。所以我使用一個主要查詢。當我在調試模式下檢查時,我發現每次執行查詢需要10秒鐘,這當然非常慢。根據我的基本知識,我已將數據庫編入索引。這裏是主要的查詢代碼:使用linq 2實體性能下降

var casts = MovieCasts.Where(d => 
      movieIds.Contains(d.MovieId) 
      && d.WorkingTitleId != null &&    
      actorAndActressWtIds.Contains((int)d.WorkingTitleId)).AsEnumerable() 
      .Where(d=>GetMoviesTop4CelebIds(d.MovieId).Contains(d.CelebId)) 
      .AsQueryable() 
      .Select(d =>new MCast 
      { 
       MovieId = d.MovieId, 
       Id = d.Id, 
       CelebId = d.CelebId, 
       CelebPageViews = d.Celebrity.PageViews, 
       ActingParts = string.Join(",",d.ActingParts.Select(e => e.Name)), 
       ActorName = HttpUtility.HtmlDecode(d.Celebrity.ShortName) ??    
          HttpUtility.HtmlDecode(d.Celebrity.BirthName), 
          }).ToList(); 

的GetMoviesTop4CelebIds()是直接接近數據庫,並返回爲int的根據影片ID的短名單(celebId)的功能。這就是爲什麼我使用了第一個AsEnumerable(),否則它給出了錯誤「LINQ to Entities does not recognized the method and can not translate ...」 (有趣的是,我應該提到的是我的代碼在調試模式下很慢使用中斷點,沒有它,速度很快,這是在開發中,在生產代碼是非常緩慢的。) 任何人都可以請幫我遮掩一些代碼?我真的很喜歡並且需要改善表現。

回答

2

調用AsEnumerable()將在此時執行Linq to Entities查詢,並使該操作的其餘部分使用Linq執行到對象。嘗試執行GetMoviesTop4CelebIds()單獨之前您執行此查詢並使用查詢結果值而不是方法調用。

+1

oright謝謝,我會嘗試它 – 2012-04-03 08:58:07