2011-05-04 11 views
5

Tengo un problema al intentar maximizar el rendimiento de nuestra vista de lista que tiene páginas.Seleccione un rango con Entity Framework

Quiero que la entidad marco haga una declaración de selección, pero solo devuelva un rango del resultado (rango = los elementos de una página de la vista de lista).

He buscado en google pero no he encontrado ningún resultado al respecto. Solo encontré que puedo hacer un .ToList(). GetRange (iniciar índice, índice final), pero luego todos los elementos se cargarían en la memoria, y eso es lo que me gustaría evitar ...

Alguien puede dime si esto se puede hacer? (No quiero usar un procedimiento almacenado o una vista o algo así porque nuestra vista de lista debe ser reutilizable ...)

¡Gracias!

+1

de salto (50) .Tomar (10) en una consulta ordenada le dará 10 artículos a partir de 50º. –

Respuesta

13

Usted debe ser capaz de utilizar .Take(x).ToList()

Edit: Lo siento, tratar .Skip(startPosition).Take(numberOfItems).ToList()

+0

Gracias, este es el truco :) –

1

Y si usted no está utilizando la carga diferida asegúrese de utilizar Query() antes de la carga() al aplicar filtros para evitar la carga toda la colección antes de la aplicación de filtros:

context.Entry(blog) 
    .Collection(b => b.Posts) 
    .Query() 
    .Skip(startPosition) 
    .Take(numberOfItems) 
    .Load() 
    .ToList(); 

Cuando se utiliza el método de consulta por lo general es mejor apagar la carga diferida para la propiedad de navegación. Esto se debe a que, de lo contrario, el mecanismo de carga diferida puede cargar automáticamente toda la colección antes o después de que se haya ejecutado la consulta filtrada.

Para más detalles: http://msdn.microsoft.com/en-us/data/jj574232.aspx