У меня есть простой запрос в репозитории:
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 в репозитории и сохранить его открытым?
В приведенном выше примере кода вы вызываете ToList()
, который получает ваши результаты из базы данных до того, как конец блока using
ваш контекст. Так что это должно работать нормально.
Если вы IQueryable
, то к тому времени, когда вы ToList()
или FirstOrDefault()
или что-то еще и действительно выполните запрос (возможно, намного позже в вашем коде), using
блок уже давно избавлен от вашего "MeetingContext", поэтому вы не может его использовать. Отсюда исключение.