Перегрузка. Расширение Where с реализацией IQueryable <T> - PullRequest
0 голосов
/ 27 августа 2011

Мой вопрос: как / когда имеет смысл перегрузить (если это возможно?) Метод 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 на основе лямбда-функции, используемой для фильтрации.

1 Ответ

1 голос
/ 27 августа 2011

Вы можете создать свой собственный тип, аналогичный IQueryable<T>, но это, вероятно, не очень хорошая идея. Вероятно, вам следует написать собственную реализацию интерфейса. Есть хорошая серия статей о том, как это сделать , но будьте готовы, сделать это не одна из самых простых задач.

...