К сожалению, EFv4 не предлагает простой способ ограничить количество возвращаемых записей для свойства навигации.
Если вы используете EntityObject
производные сущности, вы можете использовать что-то вроде:
var blog = context.Blogs
.Single(b => b.Id == blogId);
var posts = blog.Posts
.CreateSourceQuery()
.OrderByDescending(p => p.Date)
.Take(numberOfRecords)
.ToList();
Если вы используете POCO, вы должны выполнить отдельный запрос для этого (в случае прокси POCO вы можете преобразовать свойство навигации в EntityCollection<Post>
, чтобы получить доступ к CreateSourceQuery
):
var blog = context.Blogs
.Single(b => b.Id == blogId);
var posts = context.Posts
.Where(p => p.BlogId == blogId)
.OrderByDescending(p => p.Date)
.Take(numberOfPosts)
.ToList();
EFv4.1 и DbContext API предлагают способ загрузки только ограниченного числа связанных объектов:
var blog = context.Blogs
.Single(b => b.Id == blogId);
context.Entry(blog)
.Collection(b => b.Posts)
.Query()
.OrderByDescending(p => p.Date)
.Take(numberOfPosts)
.Load();
Edit:
Вы можете сделать это в одном запросе с проекцией:
var blog = context.Blogs
.Where(b => b.Id == blogId)
.Select(b => new
{
Blog = b,
Posts = b.Posts
.OrderByDescending(p => Date)
.Take(numberOfRecords)
})
.SingleOrDefault()
Просто имейте в виду, что вы должны получить доступ к сообщениям со второго параметра анонимного типа.