在实体框架中使用Include方法时,如何获取特定的行数

本文关键字:获取 何获取 框架 实体 Include 方法 | 更新日期: 2023-09-27 18:25:01

我有帖子和评论表。我可以通过以下方式获得帖子和评论:

            List<Posts> posts = db.Posts.Include("Comments").ToList();

上面的代码返回每个帖子的所有评论。我想要两样东西:

  1. 每个帖子获得5条评论
  2. 获取每条帖子的评论总数,而每条帖子只有5条评论

在实体框架中使用Include方法时,如何获取特定的行数

假设您有一个类似的后DTO/View模型/POCO

public class PostDto
{
    public string Title{ set; get; }
    public int Id { set; get; }  
    public List<PostDto> Comments { set; get; }
    public int TotalCommentCount { set; get; }
}

下面将获得所有帖子和最后5条评论。如果需要,您可以更新OrderByDescending以传递另一个属性(如插入时间戳等)

 var posts = dbContext.Posts.
        Select(s => new PostDto
        {
            Id = s.PostId,
            Title= s.PostTitle,
            TotalCommentCount = s.Comments.Count(),
            Comments = s.Comments.OrderByDescending(f => f.Id).Take(5)
                .Select(x => new PostDto
                {
                    Id = x.CommentId,
                    Name = x.CommentText
                }).ToList()
        }).ToList();

这将只对数据库执行一个查询。请在此处阅读延迟执行和性能以了解更多信息

您不能使用Include方法来获得您想要实现的目标。在以下示例中,结果以匿名类型返回:

var postInfo = db.Posts.Select(p => new
{
    Post = p,
    Comments = p.Comments.Take(5),
    TotalNumberOfComments = p.Comments.Count
})

每个帖子获得5条评论:

var postWithComments = db.Posts.Select(x => new 
  {
    Post = x,
    Comments = x.Comments.Take(5),
    CommentsCount = x.Comments.Count()
  });

方法Take(5)允许您只加载5个带有内部数据的注释,方法Count()只获取行数。