Se ho un'entità Blog con una raccolta BlogEntries che può avere centinaia di voci, c'è un modo per aggiungere prima la funzionalità di paging sul lato server con il codice EF? Ad esempio, se faccio un tipico .Skip (x) .Take (y) come faresti su un DbSet, caricherò pigro l'intera collezione e la pagherei in memoria?Nel codice del framework di entità esiste un modo per aggiungere il paging alle raccolte di navigazione?
7
A
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();
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
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). –
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