我在存储库中有一个简单的查询,如下所示:
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 query ,直到它被实际调用才执行。但是我不明白为什么会抛出异常
"DbContext Has Been DIsposed"
当我将其更改为 IQueryable<>
时,我唯一的选择是在存储库中设置 DbContext 的私有(private)实例并保持打开状态吗?
最佳答案
在上面的代码示例中,您正在调用 ToList()
,它会在 using
block 结束之前从数据库中获取您的结果来处理您的上下文。这样应该可以正常工作。
如果您返回一个 IQueryable
,那么在您调用 ToList()
或 FirstOrDefault()
或其他任何内容并实际执行查询时(可能在您的代码中很久以后),using
block 早已处理掉您的“MeetingContext”,因此您不能使用它。因此异常(exception)。
关于c# - 使用 IQueryable<> 时 DbContext 已被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24984801/