Pull to refresh
12
0

User

Send message
Он имеет ввиду, что там будет сделано 10 раз MoveNext, тогда как если брать по индексу — одна операция.
Реализация обещает итерируемое, но при попытке его проитерировать — бросает всегда исключение. Это явно не то поведение, которое закладывал разработчик. Так зачем обсуждать эту реализацию? В правильной реализации будет создаваться дб контекст при получении экземпляра итератора, и диспозится при вызове метода Dispose() итератора.
Я, честно говоря, по названию полагал, что будут обсуждаться библиотечные реализации IEnumerable, которые нарушают LSP, а автор обсуждает вместо этого 3 кастомные реализации, причем две из них абсолютно валидны с точки зрения LSP, а третья (связанная с базой данных), откровенно некорректная, но не из-за Принципа Подстановки Лисков, а потому что не выполняет того для чего она сделана (не возвращает последовательность строк из бд) вследствие ошибки реализации.
Интересно, что вначале вы предлагаете использовать вместе IExposable и IDisposable, однако в примерах этого самого IExposable ни одна из вью моделей не Disposable. Не по той ли причине, про которую пишет выше lair?
Мне кажется, тут без шансов конкурировать с теми же Jetbrains. (Resharper делает стат анализ.)
Ваш код нельзя вызывать на IQueryable поверх бд. Он не затрансферится в sql код.
вы в вашем коде получите тот же самый нулреф. Чтобы не получить, нужно вызывать так:

GetBooks().Select(c => c.Author).Where(a=>a!=null).Select(a => a.Name).ToArray(); а это слишком многословно.
Поскольку кода получилось много, я оформил этот пример в статью
На самом деле, наверное это можно сделать. Для этого придется написать свой собственный extension method который будет использоваться для получения IQueriable из IEnumerable и написать свою реализацию IQueryProvider. Я попробую это сделать и сообщу о результатах.
А они поддерживаются LINQ провайдерами, такими как EntityFramework? Если нет, то статья продолжает быть актуальной.
12 ...
9

Information

Rating
Does not participate
Registered
Activity