42

Por lo tanto, mi modelo EF tiene relaciones y, según lo que he visto en los ejemplos, esas relaciones se deben hacer con las propiedades virtuales de ICollection.EF ICollection Vs Lista Vs IEnumerable Vs IQueryable

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 debo utilizar 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?

THX

+0

Pensé que el 'virtual' es responsable de que la ejecución sea diferida o no, pero podría estar equivocado. – mfussenegger

+0

@mfussenegger virtual se acaba de utilizar en declaraciones que pueden anularse –

Respuesta

60

IQueryable:

  • de consulta no se ejecuta hasta que realmente iterar sobre los elementos, tal vez haciendo una .ToList() o una foreach. Lo que significa que aún puede agregar filtros, como un Where().
  • Extiende IEnumerable

IEnumerable:

  • sólo avance lista de elementos. No puede acceder al "elemento 4" sin pasar los elementos 0-3.
  • Lista de solo lectura, no se puede agregar o quitar de ella.
  • Aún se puede usar la ejecución diferida (IQueryable sigue siendo un IEnumerable).

IList:

  • acceso aleatorio a la lista completa
  • Probablemente completamente en la memoria (? Ninguna ejecución diferida, pero quién sabe lo que hace la clase exacta que implementa este)
  • admite la adición y eliminar
  • Extiende IEnumerable e ICollection

ICollection:

  • está entre IEnumerable y IList.
  • Extiende IEnumerable

¿Qué es "mejor" depende de sus necesidades. Por lo general, un IEnumerable es "lo suficientemente bueno" si solo desea mostrar elementos. Al menos siempre use la variante genérica.

+3

Si expone sus propiedades de navegación como IEnumerable , no podrá agregar elementos a la colección. –

+4

Buen desglose. En cuanto a la ejecución desviada, la consulta no se formará hasta que llame a .GetEnumerator en IEnumerable (del cual todos los otros tipos derivan). Si usa algo que no sea IQueryable, todos los resultados llegarán al cliente y se filtrarán allí en lugar de aplicar filtros en el nivel de la base de datos. Necesita IQueryable para retener el árbol de expresiones que GetEnumerator usará para generar el TSQL apropiado. –

+1

también vea http://stackoverflow.com/a/10113331/870291 – dotNETbeginner

1

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

Cuestiones relacionadas