2012-04-30 4 views

risposta

14

Se si esegue una query direttamente su DbSet, è possibile utilizzare Take and Skip e infatti eseguirà il paging sul server di database (queste chiamate di metodo vengono convertite in SQL). Quindi, questo funziona come previsto:

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

Attenzione che proprietà di navigazione di paging su entità caricato non funziona in questo modo:

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); 

Se si desidera ottenere il paging sulla proprietà di navigazione è necessario utilizzare esplicito carico

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

Grazie! Sono contento che ci sia un modo backdoor per realizzare questo con EF. Spero che nelle versioni future ci sia un modo per farlo, quindi non dobbiamo andare al DbContext per realizzare questo. Sai se funziona .Count() e. Any() senza caricare la collezione (usando select Count (1) e if Exists in SQL) come fa NHibernate? – Jason

+1

La proprietà di navigazione carica sempre tutte le entità correlate anche se si desidera contarle. Per supportare 'Count' è necessario [caricamento extra] (http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050591-extra-lazy-loading). –

+0

Se chiamiamo '.Load()' di nuovo sullo stesso contesto dati per un altro, * aggiunge * la pagina successiva alla raccolta invece di sostituirla. C'è un modo per aggirare questo, oltre a creare un nuovo contesto di dati? – Cocowalla