使用IQueryable<>时已经处理了DbContext

时间:2014-07-27 19:31:50

标签: c# asp.net-mvc entity-framework

我在存储库中有一个简单的查询,如下所示:

   public List<MeetingVM> GetMeetingsInRadius(decimal latitude, decimal longitude, int miles, int dayOfWeek)
   {
       var point = DbGeography.FromText(string.Format("POINT ({0} {1})", longitude, latitude), 4326);
       using (MeetingContext db = new MeetingContext())
       {
           var results = (from a in db.Meetings
                          where a.Geography.Distance(point) * 0.000621371 <= miles
                          && a.DayOfWeek == (Meetings.Models.Enums.DayOfWeek)dayOfWeek
                          select a).Select(x => new MeetingVM
                          {
                              Address = x.Address,
                              CasoID = x.Address,
                              DayOfWeek = x.DayOfWeek,
                              distance = x.Geography.Distance(point) * 0.000621371,
                              Latitude = x.Latitude,
                              LocationName = x.LocationName,
                              Longitude = x.Longitude,
                              MeetingName = x.MeetingName,
                              MeetingType = x.MeetingType,
                              Options = x.Options,
                              Time = x.Time
                          }).OrderBy(x => x.Time).ToList();               
           return results;
       }           
   }

我尝试将其更改为返回IQueryable<>而不是List<>,并且我理解它是什么,成为一个Lazy查询,并且在实际调用之前不执行。但我不明白它为什么抛出异常

  

“DbContext已被曝光”

当我将其更改为IQueryable<>时,我唯一的选择是如何在存储库中设置DbContext的私有实例并使其保持打开状态?

1 个答案:

答案 0 :(得分:5)

在上面的代码示例中,您正在调用ToList(),它会在using块结束之前从数据库中获取结果,从而处理您的上下文。所以这应该可以正常工作。

如果您返回IQueryable,那么当您调用ToList()FirstOrDefault()或其他任何内容并实际执行查询时(可能在代码中稍晚),{{1块已经处理了你的&#34; MeetingContext&#34;,所以你不能使用它。因此例外。