Usted ha sido mal informado.
IEnumerable
usará Linq para objetos, todos los métodos se ejecutan en los objetos en la memoria. - IQueryable
usará cualquier implementación de los métodos de extensión Linq proporcionada por el proveedor específico. En este caso (un repositorio), supongo que probablemente sea un proveedor que correlacione las expresiones de Linq con las declaraciones de la base de datos.
Eso significa que si usted utiliza IQueryable
:
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
El recuento se determina sobre la base de datos en sí, es decir, como una consulta "select count(*) from People"
. Esto es usualmente muy, muy rápido.
Si utiliza IEnumerable
:
IEnumerable<People> list = repository.FindAllPeople;
int count = list.Count();
Todos los casos de personas se materializarán a la memoria de uno en uno, mientras que LINQ a objetos se iteración a través de la colección para determinar el recuento. Esto será muy lento y debe evitarse siempre que sea posible.
Dado que no todas las llamadas de método se puede asignar a las consultas de bases de datos que a veces es inevitable utilizar un IEnumerable
, pero todo el filtrado, la unión y la agrupación se debe hacer en IQueryable si es posible, entonces, como último paso que puede utilizar el AsEnumerable()
métodos de extensión para cambiar a usar IEnumerable
y Linq a los objetos.
No en mi caso, contar con un documento Excel no es muy bueno para el rendimiento. 300-400ms para aproximadamente 350 filas. Gracias por tu explicación. Me ayudó a entender por qué es tan lento. –