2017-07-28 53 views
-1

我正在嘗試將地圖傳遞給視圖。在此之前,我使用來自某些實體(會話,電影,劇院)的數據填充它。我開始在會話中做選擇:編輯:爲什麼DataReader打開錯誤發生在這張地圖?

var sessions = from s in db.Sessions where s.TheaterID == id orderby s.MovieID, s.Time select s; 

這是方法。在它內部,我遍歷每個會話並驗證在我的地圖中是否有一個列表,其中的電影名稱是關鍵字。當執行到達這一點時,我收到臭名昭着的「已經有一個打開的DataReader與這個Command相關聯,必須先關閉」。例外。我不能投,因爲一個類型列表:

public ActionResult MyAction(int id) 
     { 
      Theather theater = db.Theater.Find(id); 
      ViewBag.TheaterName = theater.NomeCinema; 
      var sessions = from s in db.Sessions where s.TheaterID == id orderby s.MovieID, s.Time select s; 

      var mapMovies = new Dictionary<string, List<DateTime>>(); 

      foreach (Session s in sessions) 
      { 
       if (!mapMovies.ContainsKey(s.Movie.MovieName)) 
       { 
        mapMovies.Add(s.Movie.MovieName, new List<DateTime>()); 
       } 
       mapMovies[s.Movie.MovieName].Add(s.Time); 
      } 
      ViewBag.MapMovies = mapMovies; 
      return View(); 
     } 

在此行中出現的錯誤:

if (!mapMovies.ContainsKey(s.Movie.MovieName)) 

什麼我需要做的,通過這個錯誤?

+0

在哪一行你會得到異常? – Gusman

+0

@Gusman對不起,我忘了把這個。現在插入。 – learner

回答

1

您使用的是延遲加載,所以當您執行if (!mapMovies.ContainsKey(s.Movie.MovieName))時,上下文會嘗試發出另一個查詢來檢索電影,但是由於您處於枚舉的中間(這會使datareader處於打開狀態),您會得到異常。

解決辦法有兩個:

1 - 物化爲查詢結果轉換到一個列表:

var sessions = (from s in db.Sessions 
    where s.TheaterID == id 
    orderby s.MovieID, s.Time 
    select s).ToList(); 

2 - 包括在查詢電影實體,以便它渴望負載,而不是延遲加載的:

var sessions = from s in db.Sessions.Include(s => s.Movie) 
    where s.TheaterID == id 
    orderby s.MovieID, s.Time 
    select s; 
相關問題