Они выбрали интерфейс, который сделали, потому что он дает понятную абстракцию над магическими запросами, которые Entity Framework выполняет при использовании Linq.
Вот разница между интерфейсами:
IEnumerable<T>
только для чтения
- Вы можете добавлять и удалять элементы в
ICollection<T>
- Вы можете сделать произвольный доступ (по индексу) к
List<T>
Из них ICollection
и IEnumerable
хорошо отображаются на операции базы данных, поскольку запросы и добавление / удаление объектов - это то, что вы можете делать в БД.
Произвольный доступ по индексу также не отображается, так как вам нужно будет иметь существующий результат запроса для повторения, или каждый случайный доступ будет запрашивать базу данных снова. Кроме того, на что будет привязан индекс? Номер строки? Существует не так много запросов с номерами строк, которые вы бы хотели выполнить, и это вовсе не полезно при создании запросов большего размера. Так что они просто не поддерживают это.
ICollection<T>
поддерживается и позволит вам как запрашивать, так и изменять данные, поэтому используйте это.
Причина, по которой List<T>
работает с самого начала, заключается в том, что реализация EF в конечном итоге возвращает одну в конце. Но это в конце цепочки запросов, а не в начале. Таким образом, выполнение ваших свойств ICollection<T>
сделает более очевидным, что EF создает группу SQL и возвращает только List<T>
в конце, а не выполняет запросы для каждого уровня Linq, который вы используете.