C# 在实体框架中使用Include方法时,如何获得特定的行数?
我有帖子和评论表。我可以通过以下方式获得帖子和评论:C# 在实体框架中使用Include方法时,如何获得特定的行数?,c#,sql-server,asp.net-mvc,entity-framework,C#,Sql Server,Asp.net Mvc,Entity Framework,我有帖子和评论表。我可以通过以下方式获得帖子和评论: List<Posts> posts = db.Posts.Include("Comments").ToList(); List posts=db.posts.Include(“Comments”).ToList(); 上面的代码返回每个帖子的所有注释。我想要两件事: 每个帖子都有5条评论 获取每篇文章的评论总数,而每篇文章仅获得5条评论 您不能使用Include方法来获得您想要实现的目标。 在以下示例中
List<Posts> posts = db.Posts.Include("Comments").ToList();
List posts=db.posts.Include(“Comments”).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()
只获取行数。假设您有这样一个Post DTO/View model/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; }
}
这将只对数据库执行一个查询。阅读以了解更多信息其中包括哪些内容?此更新答案与Maxim Goncharuk的答案完全相同。你应该删除而不是更新你的问题。除此之外,你不能用include(它总是带来所有真实的行,你不能过滤或限制它)@JotaBe我不理解你的问题。无论如何,如果你认为我已经复制了它,你应该注意我的答案是10分钟前:)我不介意你是否复制了它。问题是你没有在任何地方使用
Include
,你也不能使用它。我想你最初的问题包含了一些与Include
相关的内容,我想这已经不存在了,因为你是在马克西姆回答5分钟后编辑的。别担心,不要急于获得声誉:好的答案会一直带给你。因此,通过回答问题来帮助和学习是非常好的。剩下的就靠自己了;)很多时候,大多数声誉来自最意想不到的答案。如果不使用ToList()
或ToArray()
,实体框架允许加载部分数据。这毫无意义。请更新您的解释:具体化查询与“加载部分数据”完全无关。您的答案使用了一个到匿名类的投影。与Maxim Goncharuk的答案类似,但投影到一个具体类,并包括获取最新评论所需的顺序。
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();