获得n个子元素

时间:2017-12-11 14:38:23

标签: c# .net entity-framework

我有两个表:BlogPost。博客表可以有很多帖子。

我想获得一个带有相应帖子的博客,但我想只有每个博客有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个帖子。

2 个答案:

答案 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个帖子。