Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中使用Include方法时,如何获得特定的行数?_C#_Sql Server_Asp.net Mvc_Entity Framework - Fatal编程技术网

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();
上面的代码返回每个帖子的所有注释。我想要两件事:

  • 每个帖子都有5条评论
  • 获取每篇文章的评论总数,而每篇文章仅获得5条评论

  • 您不能使用
    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();