当使用IQueryable<>时,DbContext已被处理

本文关键字:DbContext 处理 IQueryable | 更新日期: 2023-09-27 18:15:20

我在存储库中有一个简单的查询:

   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<>,我明白这是怎么做的,成为一个懒惰的查询,直到它被实际调用才执行。但是我不明白为什么会抛出异常

"DbContext Has Been dispose "

当我将其更改为IQueryable<>时,我唯一的选择是使这项工作在存储库中设置DbContext的私有实例并保持开放吗?

当使用IQueryable<>时,DbContext已被处理

在上面的代码示例中,调用ToList(),它在using块结束处理上下文之前从数据库获取结果。这应该没问题。

如果你返回一个IQueryable,那么到你调用ToList()FirstOrDefault()或任何实际执行查询的时候(也许在你的代码中晚些时候),using块早就处理了你的"MeetingContext",所以你不能使用它。