在实体框架中使用Include方法时,如何获取特定的行数
本文关键字:获取 何获取 框架 实体 Include 方法 | 更新日期: 2023-09-27 18:25:01
我有帖子和评论表。我可以通过以下方式获得帖子和评论:
List<Posts> posts = db.Posts.Include("Comments").ToList();
上面的代码返回每个帖子的所有评论。我想要两样东西:
- 每个帖子获得5条评论
- 获取每条帖子的评论总数,而每条帖子只有5条评论
假设您有一个类似的后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()
只获取行数。