Реализация обещает итерируемое, но при попытке его проитерировать — бросает всегда исключение. Это явно не то поведение, которое закладывал разработчик. Так зачем обсуждать эту реализацию? В правильной реализации будет создаваться дб контекст при получении экземпляра итератора, и диспозится при вызове метода Dispose() итератора.
Я, честно говоря, по названию полагал, что будут обсуждаться библиотечные реализации IEnumerable, которые нарушают LSP, а автор обсуждает вместо этого 3 кастомные реализации, причем две из них абсолютно валидны с точки зрения LSP, а третья (связанная с базой данных), откровенно некорректная, но не из-за Принципа Подстановки Лисков, а потому что не выполняет того для чего она сделана (не возвращает последовательность строк из бд) вследствие ошибки реализации.
Интересно, что вначале вы предлагаете использовать вместе IExposable и IDisposable, однако в примерах этого самого IExposable ни одна из вью моделей не Disposable. Не по той ли причине, про которую пишет выше lair?
На самом деле, наверное это можно сделать. Для этого придется написать свой собственный extension method который будет использоваться для получения IQueriable из IEnumerable и написать свою реализацию IQueryProvider. Я попробую это сделать и сообщу о результатах.
GetBooks().Select(c => c.Author).Where(a=>a!=null).Select(a => a.Name).ToArray(); а это слишком многословно.