c# - EF ICollection Vs List Vs IEnumerable Vs IQueryable
entity-framework entity-framework-4 (2)
entonces, mi modelo EF tiene relaciones y, de acuerdo con lo que he visto en los ejemplos, esas relaciones se deben hacer con las propiedades virtuales de ICollection.
Ejemplo:
public class Task
{
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<SubTask> { get; set; }
}
Leí en alguna parte que debería usar IEnumerable para evitar la ejecución diferida, ¿es correcto? Significa que si mis métodos DAL devuelven IEnumerable, todavía de IQueryable, el SQL se ejecutará en ese momento, y no en el momento en que llamo a .TOList en la página web.
Entonces, ¿cuál es la mejor práctica? ¿Qué debo devolver? IEnumerable, List ?, IList, ICollection?
Gracias
Otra diferencia en el caso de EF es que IEnumerable no está ejecutando la consulta en el DB hasta que realmente enumere la lista. Mientras que IList ejecutará la consulta y buscará los elementos en la memoria. Tuve un comportamiento extraño con el almacenamiento en caché. Chaching the IEnumarable no almacenaba los elementos, sino la enumeración no recuperada, cada vez que llamaba a la caché y obtenía la enumeración para algún propósito, iba a la base de datos y ejecutaba la consulta, por lo que el almacenamiento en caché era inútil. Pero un ToList () en la enumeración buscó los elementos y almacenó los elementos en el caché, por lo que solo 1 viaje al DB para esto. Encuentre más en esta publicación: http://www.dailycode.info/BlogV2/post/entityframework-adding-ienumerable-to-cache
- Query no se ejecuta hasta que realmente itere sobre los elementos, tal vez haciendo un
.ToList()
o unforeach
. Lo que significa que aún puede agregar filtros, como unWhere()
. - Extiende IEnumerable
- Lista de artículos solo para reenvío. No puede acceder al "elemento 4" sin pasar los elementos 0-3.
- La lista de solo lectura no puede agregarse ni quitarse de ella.
- Todavía podría usar la ejecución diferida (IQueryable sigue siendo un IEnumerable).
IList
:
- Acceso aleatorio a la lista completa
- Probablemente esté completamente en la memoria (no hay ejecución diferida, pero ¿quién sabe qué clase exacta implementa esto?)
- Admite agregar y eliminar
- Extiende IEnumerable e ICollection
- Está entre IEnumerable e IList.
- Extiende IEnumerable
Lo que es "mejor" depende de sus requisitos. Por lo general, un IEnumerable es "lo suficientemente bueno" si solo desea mostrar elementos. Al menos siempre use la variante genérica.