2012-04-30 5 views
7

Wenn ich eine Blog-Entität mit einer BlogEntries-Sammlung habe, die Hunderte von Einträgen enthalten kann, gibt es eine Möglichkeit, serverseitige Paging-Funktionalität zuerst mit EF-Code hinzuzufügen? Zum Beispiel, wenn ich eine typische .Skip (x) .Take (y) wie Sie auf einem DbSet tun würde, wird es die gesamte Sammlung faul laden und es im Speicher ablegen?In Entity Framework-Code gibt es zuerst eine Möglichkeit zum Hinzufügen von Paging zu Navigationssammlungen?

Antwort

14

Wenn Sie direkt DbSet abfragen, können Sie Take und Skip verwenden, und es wird tatsächlich auf dem Datenbankserver gepauscht (diese Methodenaufrufe werden in SQL übersetzt). So funktioniert das wie erwartet:

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

Beachten Sie, dass Paging-Navigationseigenschaften auf geladene Einheit nicht auf diese Weise funktioniert:

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

Wenn Sie das Paging auf Navigationseigenschaft erhalten möchten, müssen Sie explizite Laden verwenden

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

Danke! Ich bin froh, dass es eine Hintertür gibt, um dies mit EF zu erreichen. Ich hoffe, in zukünftigen Versionen wird es einen Weg geben, dies eingebaut zu machen, so dass wir nicht zum DbContext gehen müssen, um dies zu erreichen. Weißt du, ob es .Count() und .Any() tut, ohne die Sammlung zu laden (mit Select Count (1) und wenn Existiert in SQL) wie NHibernate? – Jason

+1

Die Navigationseigenschaft lädt immer alle zugehörigen Entitäten, auch wenn Sie sie nur zählen möchten. Um 'Count 'zu unterstützen, benötigen Sie [extra laden] (http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050591-extra-lazy-loading). –

+0

Wenn wir '.Load()' im selben Datenkontext erneut aufrufen, fügt * die nächste Seite der Sammlung hinzu, anstatt sie zu ersetzen. Gibt es einen anderen Weg, als einen neuen Datenkontext zu erstellen? – Cocowalla

Verwandte Themen