Мой вопрос: как / когда имеет смысл перегрузить (если это возможно?) Метод Where () extension IQueryable, когда вы создаете свою собственную реализацию IQueryable?
Например, в Entity Framework мое понимание того, что вызов Where (), сделанный для ObjectSet, изменит фактический SQL, который передается в базу данных. В качестве альтернативы, если вы сначала приведете к IEnumerable (), фильтрация будет выполняться с использованием LINQ-To-Objects, а не LINQ-To-Entities.
Например:
new MyDBEntities().MyDbTable.Where(x => x.SomeProperty == "SomeValue");
// this is linq-to-entities and changes the database-level SQL
Versus:
new MyDBEntities().MyDbTable.AsEnumerable().Where(x => x.SomeProperty == "SomeValue");
// this is linq-to-objects and filters the IEnumerable
Как вы справляетесь с этим, когда реализуете свой собственный IQueryable, а у IQueryable уже есть предопределенные методы расширения, такие как Where ()? В частности, я хочу создать свой собственный очень простой ORM, который использует собственный SQL и SqlDataReader, и хочу иметь метод .Where (), который изменяет собственный SQL перед передачей его в базу данных.
Должен ли я даже использовать IQueryable или просто полностью создать свой собственный класс? Я хочу иметь возможность использовать лямбда-синтаксис и изменить свою команду SQL на основе лямбда-функции, используемой для фильтрации.