List, IList, IEnumerable, IQueryable, ICollection, ¿cuál es el tipo de devolución más flexible?

He visto esta pregunta publicada anteriormente, pero no estoy satisfecho de haber entendido las ramificaciones completas. El problema es qué tipo de devolución debería tener una capa de datos que utiliza el retorno de linq-a-sql para una máxima flexibilidad y capacidad de consulta. Esto es lo que he leído / encontrado:

  1. IEnumerable es limitado y solo permite la operación de lectura hacia adelante. IEnumerable es el más genérico. Lo que he encontrado es que IEnumerable permite operaciones de consulta frente a la syntax de la extensión.

  2. La lista permite la mayor flexibilidad debido a las operaciones de inserción.

  3. Se deben usar colecciones en lugar de listas para habilitar las colecciones de solo lectura.

  4. IQueryable nunca debe usarse, debe “usarse y apagarse”. IQueryable no devuelve una lista sino que genera una syntax de consulta para la base de datos.

Siento que tengo una mejor idea de las compensaciones pero aún no estoy seguro de algunas cosas:

  1. ¿Por qué elegiría las variantes de interfaz sobre los tipos concretos? Es decir, IList o ICollection versus List o Collection. ¿Qué beneficio obtendré?

  2. Veo que las operaciones de extensión funcionan, pero ¿funcionará también la syntax de consulta ampliada?

  3. Alguien sugirió que use AsQueryable () antes. Pero, ¿por qué haría esto si no tengo conexión a la base de datos? Parece que los métodos de extensión funcionan independientemente.

Las colecciones generalmente no son muy útiles para los retornos de DAL, porque una colección no garantiza implícitamente el orden. Es solo un cubo de artículos. Un IList, por otro lado, garantiza implícitamente el orden. Así que estamos en IEnumerable o IList. La siguiente pregunta sería: ¿está el objeto List “en vivo”? es decir, ¿está conectado al respaldo de datos para que cuando agregue un elemento al IList, se refleje en el DB? Para LINQ-to-SQL, este no es el caso. Más bien, se supone que debes adjuntar entidades a las tablas. Entonces, a menos que suministre este cableado adicional, una Lista es superflua. Quédese con IEnumerable.

IEnumerable <> => Permite el uso de ‘foreach’ en una colección

ICollection <> => Como IEnumerable <> + Add (), Remove (), Count, Clear (), Contains (), IsReadOnly, CopyTo ()

IList <> => Como ICollection <> + this [int], Insertar (), IndexOf (), RemoveAt (). es decir. Agrega operadores de listas de tipos de indexación

• ¿Se puede usar ‘rendimiento de devolución ???’ junto con IEnumerable <> para devolver solo 1 objeto a la vez. Aquí es de donde proviene el poder real de IEnumerable (no simplemente devolviendo una lista o una matriz).

• Al devolver una lista, decida qué puede exponerse al usuario y devuelva el tipo apropiado.

• Tal vez sea mejor devolver un ICollection <> o IList <> y si el cliente de código solo necesita enumerar la lista, puede convertirlo en un IEnumerable <>. es decir. Given ICollection SomeMethod () … El usuario podría invocarlo como IEnumerable widgets = SomeMethod ()

Siempre debe devolver una interfaz en lugar de un tipo concreto, esto es evidente ya que especifica el comportamiento permitido sin vincular al consumidor a una implementación específica.

En términos de qué interfaz volver, debe pensar en el propósito del método y las intenciones de la persona que llama. Si devuelve una colección, ¿debería la persona que llama poder modificar la colección? por ejemplo, agregar / eliminar elementos? si todo lo que necesitan hacer es enumerarlo (hacer un foreach), entonces simplemente debe devolver un IEnumerable.

1) Lo mejor es devolver un IList para que los resultados puedan colocarse en cualquier objeto que implemente esa interfaz, en lugar de forzar al llamante a usar una Lista. Por ejemplo, la persona que llama podría desear que los resultados vuelvan a una ArrayList, esto no sería posible si tuviera los resultados devueltos a una lista. ArrayList no hereda de List, pero implementa IList.