Список, IList, IEnumerable, IQueryable, ICollection, какой наиболее гибкий тип возврата? - PullRequest
48 голосов
/ 24 августа 2010

Я видел этот вопрос, опубликованный здесь ранее, но я не удовлетворен тем, что понимаю все последствия.Проблема в том, какой тип возврата должен возвращать слой данных, использующий linq-to-sql, для максимальной гибкости и возможности запроса.Вот что я прочитал / нашел:

  1. IEnumerable ограничен и допускает только операцию пересылки на чтение.IEnumerable является самым общим.Я обнаружил, что IEnumerable разрешает операции запросов против синтаксиса расширения.

  2. Список обеспечивает большую гибкость благодаря операциям вставки.

  3. Коллекции следует использовать вместо списка, чтобы включить коллекции только для чтения.

  4. Никогда не следует использовать IQueryable, его следует «использовать и отключить».IQueryable не возвращает список, но генерирует синтаксис запроса для базы данных.

Я чувствую, что лучше чувствую компромиссы, но все еще не уверен в некоторых вещах:

  1. Зачем мне выбирать варианты интерфейса для конкретных типов?Т.е. IList или ICollection против Списка или Коллекции.Какую выгоду я бы получил?

  2. Я вижу, что операции расширения работают, но будет ли работать расширенный синтаксис запросов?

  3. Кто-то предложил мнеиспользуйте AsQueryable () раньше.Но зачем мне это делать, если у меня нет подключения к базе данных?Кажется, методы расширения работают независимо.

Ответы [ 3 ]

29 голосов
/ 24 августа 2010

Коллекции обычно не очень полезны для возвратов DAL, потому что коллекция не гарантирует неявно порядок. Это просто ведро предметов. IList, с другой стороны, неявно гарантирует порядок. Итак, мы до IEnumerable или IList. Следующий вопрос будет таким: является ли объект List «живым»? т. е. связано ли это с поддержкой данных, чтобы при добавлении элемента в IList он отражался в БД? Для LINQ-to-SQL это не так. Скорее, вы должны прикрепить сущности к таблицам. Таким образом, если вы не предоставите эту дополнительную проводку, список будет излишним. Палка с IEnumerable.

7 голосов
/ 16 февраля 2012

Вы должны всегда возвращать интерфейс, а не конкретный тип, это само собой разумеется, поскольку оно определяет поведение, разрешенное без привязки потребителя к конкретной реализации.

С точки зрения того, какой интерфейс возвращать, вы должныподумайте о назначении метода и намерениях звонящего.Если вы вернете коллекцию, сможет ли звонящий изменить коллекцию?например, добавить / удалить элементы?если все, что им нужно сделать, это перечислить его (выполнить foreach), тогда вам просто нужно вернуть IEnumerable.

3 голосов
/ 25 августа 2010

1) Лучше всего вернуть IList, чтобы результаты могли быть помещены в любой объект, который реализует этот интерфейс, вместо того, чтобы заставлять вызывающую сторону использовать List. Например, вызывающая сторона может пожелать, чтобы результаты были возвращены в ArrayList, это было бы невозможно, если бы вы возвращали результаты в список. ArrayList не наследуется от List, но он реализует IList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...