Как видно из названия, я ищу способ сделать предложение where в сочетании с include.
Вот мои ситуации: Я несу ответственность за поддержку большого приложения, наполненного запахами кода. Слишком много кода вызывает ошибки везде, поэтому я ищу безопасное решение.
Скажем, у меня есть объект Bus и объект People (у шины есть навигационная накладка Collection of People). В моем запросе мне нужно выбрать все автобусы только с теми, кто бодрствует. Это упрощенный пример фиктивного
В текущем коде:
var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
foreach(var person in passengers)
{
bus.Passengers.Add(person);
}
}
После этого кода Контекст расположен и в вызывающем методе результирующие объекты шины отображаются в класс DTO (100% -ная копия Entity).
Этот код вызывает несколько вызовов в БД, который является No-Go, поэтому я нашел это решение В блогах MSDN
Это отлично работало при отладке результата, но когда объекты сопоставлены с DTO (с использованием AutoMapper), я получаю исключение, что Контекст/Соединение закрыто и что объект не может быть загружен. (Контекст всегда закрыт, не может изменить это:()
Поэтому мне нужно убедиться, что выбранные пассажиры уже загружены (свойство IsLoaded on navigation также является False). Если я осмотрю коллекцию Пассажиров, The Count также выбрасывает Exception, но есть также коллекция Collection of Passegers, называемая "обернутые связанные сущности", которые содержат мои фильтрованные объекты.
Есть ли способ загрузить эти завернутые связанные объекты во всю коллекцию? (Я не могу изменить конфигурацию отображения automapper, потому что это используется во всем приложении).
Есть ли другой способ получить активных пассажиров?
Любые подсказки приветствуются...
Изменить
Ответ Герта Арнольда не работает, потому что данные не загружаются с нетерпением. Но когда я упрощаю его и удаляю, где он загружен. Это действительно странно, так как sql execute возвращает всех пассажиров в обоих случаях. Таким образом, возникает проблема при возврате результатов в объект.
Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
.Select(b => new
{
b,
Passengers = b.Passengers
})
.ToList()
.Select(x => x.b)
.ToList();
Edit2
После большой борьбы ответ Герта Арнольда работает! Как сказал Герт Арнольд, вам необходимо отключить Lazy Loading и Keep it OFF. Это потребует внесения дополнительных изменений в приложение, так как предыдущий разработчик любил Lazy Loading -_-