2012-04-30 13 views
7

Si tengo una entidad Blog con una colección BlogEntries que puede tener cientos de entradas, ¿hay alguna manera de agregar primero cualquier funcionalidad de paginación del lado del servidor con código EF? Por ejemplo, si hago un .Skip (x) .Take (y) típico como lo haría en un DbSet, ¿cargará perezosamente toda la colección y la colocará en la memoria?En el código de entidad de marco primero, ¿hay alguna manera de agregar paginación a las colecciones de navegación?

Respuesta

14

Si consulta directamente DbSet puede usar Tomar y Omitir y de hecho ejecutará paginación en el servidor de la base de datos (estas llamadas a métodos se traducen a SQL). Así que esto funciona como se esperaba:

// Loads only 10 expected entries through Linq-to-entities 
var entries = context.BlogEntries.OrderBy(e => e.Date).Skip(10).Take(10); 

Tenga en cuenta que las propiedades de navegación de paginación en la entidad cargado no funciona de esta manera:

var blog = context.Blogs.First(); 
// Lazy loading always loads all related entries and executes ordering and 
// paging through Linq-to-objects! 
var entires = blog.BlogEntries.OrderBy(e => e.Date).Skip(10).Take(10); 

Si desea obtener paginación en propiedad de navegación debe utilizar la carga explícita

var blog = context.Blogs.First(); 
var dbEntry = context.Entry(blog); 
// This is the way to use Linq-to-entities on navigation property and 
// load only subset of related entities 
var entries = dbEntry.Collection(b => b.BlogEntries) 
        .Query() 
        .OrderBy(e => e.Date) 
        .Skip(10) 
        .Take(10) 
        .Load(); 
+1

Gracias! Me alegra que haya una puerta trasera para lograr esto con EF. Espero que en futuras versiones haya una manera de hacer esto incorporado así que no tenemos que ir al DbContext para lograr esto. ¿Sabes si lo hace .Count() y .Any() sin cargar la colección (usando select Count (1) y si existe en SQL) como lo hace NHibernate? – Jason

+1

La propiedad de navegación siempre carga todas las entidades relacionadas aunque solo quiera contarlas. Para admitir 'Count' necesita [carga adicional] (http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050591-extra-lazy-loading). –

+0

Si volvemos a llamar '.Load()' en el mismo contexto de datos para otro diferente, * agrega * la página siguiente a la colección en lugar de reemplazarla. ¿Hay alguna forma de evitar esto, además de crear un nuevo contexto de datos? – Cocowalla

Cuestiones relacionadas