2012-02-12 12 views

Respuesta

20

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.

+0

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. –

0

No estoy familiarizado con el infeasability de IQueryable, pero this blog post parece indicar que IQueryable es mucho más preferible IEnumerable porque IQueryable permite el acceso a la expresión subyacente.

Esto solo puede ser relevante en el caso de una cláusula Where y no afecta a .Count().

Cuestiones relacionadas