编辑:为什么DataReader打开错误发生在这张地图?

时间:2017-07-28 02:41:11

标签: c# asp.net collections

我正在尝试将地图传递给视图。在此之前,我使用来自某些实体(会话,电影,剧院)的数据填充它。我开始在我的会话中做出选择:

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

这是方法。在里面我迭代每个会话并验证我的地图中是否有一个以电影名称为键的列表。当执行到达这一点时,我收到臭名昭着的“已经有一个与此命令关联的开放DataReader,必须先关闭它。”例外。由于类型的原因,我无法转换为列表:

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 ) )

我需要做什么才能传递此错误?

1 个答案:

答案 0 :(得分: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 - 在查询中包含Movie实体,因此它需要加载而不是延迟加载:

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