7

何百ものエントリを持つ可能性のある BlogEntries コレクションを持つブログ エンティティがある場合、最初に EF コードを使用してサーバー側のページング機能を追加する方法はありますか? たとえば、DbSet の場合のように典型的な .Skip(x).Take(y) を実行すると、コレクション全体が遅延ロードされ、メモリにページングされますか?

4

1 に答える 1

16

直接クエリをDbSet実行すると、Take と Skip を使用でき、実際にデータベース サーバーでページングが実行されます (これらのメソッド呼び出しは SQL に変換されます)。したがって、これは期待どおりに機能します。

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

読み込まれたエンティティのナビゲーション プロパティのページングは​​、この方法では機能しないことに注意してください。

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

ナビゲーション プロパティでページングを取得する場合は、明示的な読み込みを使用する必要があります

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();
于 2012-04-30T07:23:30.180 に答える