我在存储库中有一个简单的查询,如下所示:
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的私有实例并使其保持打开状态?
答案 0 :(得分:5)
在上面的代码示例中,您正在调用ToList()
,它会在using
块结束之前从数据库中获取结果,从而处理您的上下文。所以这应该可以正常工作。
如果您返回IQueryable
,那么当您调用ToList()
或FirstOrDefault()
或其他任何内容并实际执行查询时(可能在代码中稍晚),{{1块已经处理了你的&#34; MeetingContext&#34;,所以你不能使用它。因此例外。