当使用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的私有实例并保持开放吗?
在上面的代码示例中,调用ToList()
,它在using
块结束处理上下文之前从数据库获取结果。这应该没问题。
如果你返回一个IQueryable
,那么到你调用ToList()
或FirstOrDefault()
或任何实际执行查询的时候(也许在你的代码中晚些时候),using
块早就处理了你的"MeetingContext",所以你不能使用它。