我有两个表:Blog
和Post
。博客表可以有很多帖子。
我想获得一个带有相应帖子的博客,但我想只有每个博客有4个帖子并且只获得4个帖子。此外,在那之后,我想使用Automapper将结果映射到我的模型:
return _context.Blogs
.Include(x => x.Posts)
.Where(x => x.IsActive && x.Posts.Count >= 4)
.ProjectTo<BlogVm>();
BlogVm
包含与Blog
实体相同的属性(与Post相同)。我使用的是EntityFrameworkCore。
所以你知道我该怎么办呢?
更新: 该代码返回每个博客的所有帖子不仅4。 我想让博客至少有4个帖子,只加载4个帖子。
答案 0 :(得分:-1)
我不确定它是否有效(从未测试过),但你应该在你的包含中使用Take:
return _context.Blogs
.Include(x => x.Posts.Take(4))
.Where(x => x.IsActive && x.Posts.Count >= 4)
.ProjectTo<BlogVm>();
答案 1 :(得分:-1)
试试这个(除了映射到你的模型):
var q = (
from blog in _context.Blogs
from post in blog.Posts
group blog by new
{
BlogId = blog.Id,
PostId = post.Id,
PostText = post.Text,
}
into g
where g.Count() >= 4
select new
{
g.Key.BlogId,
g.Key.PostId,
g.Key.PostText
}
).Take(4);
或类似的:
var q1 = _context.Blogs.SelectMany(blog => blog.Posts, (blog, post) => new { blog, post })
.GroupBy(@t => new { BlogId = blog.Id, PostId = post.Id, PostText = post.Text }, @t => blog)
.Where(g => g.Count() >= 4)
.Select(g => new { g.Key.BlogId, g.Key.PostId, g.Key.PostText })
.Take(4);
有错误。结果只需要4行。如果没有Take(4),它将为您提供所有博客,每个博客至少有4个帖子。