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